Objective-C Blocks - 用作对象

Luk*_*ice 4 cocoa-touch objective-c objective-c-blocks

参考下面的代码,一旦一个块被放入一个数组,你如何获取该块对象并运行该块中的实际代码.

另一个问题:如果我在下面的块中调用方法,该块是否封装了该方法中的代码或捕获方法的签名并以这种方式调用它?

-(void)blockCalledMethod
{
    NSLog(@"Hello World");
}

-(void)programStart
{       

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];    

    id pointerToBlock = [array lastObject];
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 7

像这样称呼它:

void (^pointerToBlock)(void) = [array lastObject];
pointerToBlock(); // because ^ {} is void(^)(void)
Run Code Online (Sandbox Code Playgroud)

你不能声明pointerToBlockid,如果你想直接调用它,因为编译器将其识别为一个块类型,而不仅仅是一个对象.

如果我在上面的块中调用方法,该块是否封装了该方法中的代码或捕获方法的签名并以这种方式调用它?

我应该考虑self调用类.

  • `self`指的是定义块的对象,即`programStart`方法中的`self`.请注意,在这种情况下,"self"会被保留,[可能会创建一个保留周期](http://www.mikeash.com/pyblog/friday-qa-2010-04-30-dealing-with-retain-cycles.html ) (5认同)