mga*_*mer 4 lambda function objective-c anonymous-function objective-c-blocks
如何在Objective-C中分配并随后调用一个将函数返回给局部变量的函数?
更新:
我想出了以下内容,但它仍然不对我害怕:
(void (^)()) (^loadedCallback) () = (void (^)()) ^(){
@synchronized (synchronizer) {
semaphore++;
}
return Block_copy(^{
@synchronized (synchronizer) {
semaphore--;
if (semaphore == 0) {
onAllLoaded();
}
}
}); };
Run Code Online (Sandbox Code Playgroud)
首先,您需要了解函数指针声明语法.对于块来说它是一样的,除了它是一个^而不是一个*.
然后,您需要创建一个块并返回它的副本,并将其分配给正确声明的变量.
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);
Run Code Online (Sandbox Code Playgroud)
编辑以解决OP的编辑:typedefs通常用于使代码更易于阅读.对于块和函数指针,它也使编写更容易.有一个内置的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);
};
Run Code Online (Sandbox Code Playgroud)