如何使用ARC将块实例化为实例变量?

时间:2013-04-23 08:49:12

标签: objective-c objective-c-blocks

如何做出类似这样的工作?

void (^)(void) *someBlock = ^{
  //some code
};

2 个答案:

答案 0 :(得分:7)

德米特里的答案是完全正确的。将块语法看作C函数声明:

// C function -> <return type> <function name> (<arguments>)
void someFunction(void) 
{
  // do something
}

// block -> <return type> (^<block variable name>) (<arguments>)
void (^someBlock)(void) = ^{
    // do something
};

另一个例子:

// C function
int sum (int a, int b)
{
    return a + b;
}

// block
int (^sum)(int, int) = ^(int a, int b) {
    return a + b;
};

因此,只需将块语法视为C函数声明: 首先返回类型int,然后是块变量(^sum)的名称,然后是参数类型(int, int)的列表。

但是,如果您的应用中经常需要某种类型的阻止,请使用typedef:

typedef int (^MySumBlock)(int, int);

现在您可以创建MySumBlock类型的变量:

MySumBlock debugSumBlock = ^(int a, int b) {
    NSLog(@"Adding %i and %i", a, b);
    return a + b;
};

MySumBlock normalSumBlock = ^(int a, int b) {
    return a + b;
};

希望有所帮助:)

答案 1 :(得分:2)

只是阻止语法

void (^someBlock)(void) = ^{
     //some code
};