如何在Objective-C中分配并随后调用一个将函数返回给局部变量的函数?
更新:
我想出了以下内容,但它仍然不对,我害怕:
(void (^)()) (^loadedCallback) () = (void (^)()) ^(){
@synchronized (synchronizer) {
semaphore++;
}
return Block_copy(^{
@synchronized (synchronizer) {
semaphore--;
if (semaphore == 0) {
onAllLoaded();
}
}
}); };
答案 0 :(得分:5)
首先,您需要了解function pointer declaration syntax。除了它是^
而不是*
之外,它与块相同。
然后,您需要创建一个块并返回它的副本,并将其分配给正确声明的变量。
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);
编辑以解决OP的编辑问题:typedef
通常用于使代码更易于阅读。对于块和函数指针,它也使编写更容易。对于不接受任何参数并返回typedef
的块,有一个内置的dispatch_block_t
(void
);你应该使用它。您还应该根据需要制作尽可能多的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);
};