返回函数的函数

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)

zne*_*eak 5

首先,您需要了解函数指针声明语法.对于块来说它是一样的,除了它是一个^而不是一个*.

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

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)