gpt4 book ai didi

objective-c - 返回函数的函数

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:23 26 4
gpt4 key购买 nike

如何在 Objective-C 中分配并随后调用将函数返回给局部变量的函数?

更新:

我想出了以下方法,但恐怕还是不对:

(void (^)()) (^loadedCallback) () = (void (^)()) ^(){
@synchronized (synchronizer) {
semaphore++;
}
return Block_copy(^{
@synchronized (synchronizer) {
semaphore--;
if (semaphore == 0) {
onAllLoaded();
}
}
}); };

最佳答案

首先,您需要了解 function pointer declaration syntax . block 也是一样的,只是它是 ^ 而不是 *

然后,您需要创建一个 block 并返回它的副本,并将其分配给正确声明的变量。

typedef NSArray* (^my_block_type_t)(int, float);

my_block_type_t createBlock()
{
my_block_type_t block = ^(int a, float b)
{
return [NSArray array];
};
return Block_copy(block);
}

/* snip */
my_block_type_t theBlock = createBlock();
theBlock();
Block_release(theBlock);

EDIT 以解决 OP 的编辑问题:typedef 通常用于使代码更易于阅读。在 block 和函数指针的情况下,它也更容易编写。对于不接受任何参数并返回 void 的 block ,有一个内置的 typedef (dispatch_block_t);你应该使用它。您还应该根据需要创建尽可能多的 typedef,以避免必须使用丑陋的声明语法函数指针,否则会强制您的代码。

typedef dispatch_block_t (^block_creator_t)();

block_creator_t loadedCallback = ^{
@synchronized (synchronizer)
{
semaphore++;
}

dispatch_block_t result = ^{
@synchronized (synchronizer)
{
semaphore--;
if (semaphore == 0)
onAllLoaded();
}
};

return Block_copy(result);
};

关于objective-c - 返回函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com