返回函数的函数

时间:2011-07-13 13:41:35

标签: objective-c function lambda anonymous-function objective-c-blocks

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

更新:

我想出了以下内容,但它仍然不对,我害怕:

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

1 个答案:

答案 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_tvoid);你应该使用它。您还应该根据需要制作尽可能多的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);
};