Objective-C块-用作对象

Objective-C块-用作对象,objective-c,cocoa-touch,objective-c-blocks,Objective C,Cocoa Touch,Objective C Blocks,参考下面的代码,一旦一个块被放入一个数组中,如何获取该块对象并在该块中运行实际代码 另一个问题:如果我在下面这样的块中调用一个方法,该块是封装该方法中的代码还是捕获该方法的签名并以这种方式调用它 -(void)blockCalledMethod { NSLog(@"Hello World"); } -(void)programStart { NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [sel

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


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

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

-(void)programStart
{       

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

    id pointerToBlock = [array lastObject];
}
可以这样称呼:

void (^pointerToBlock)(void) = [array lastObject];
pointerToBlock(); // because ^ {} is void(^)(void)
如果要直接调用它,则不能将
pointerToBlock
声明为
id
,因为编译器必须将其识别为块类型,而不仅仅是对象


如果我在上面这样的块中调用一个方法,该块是将代码封装在该方法中还是捕获该方法的签名并以这种方式调用它

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

-(void)programStart
{       

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

    id pointerToBlock = [array lastObject];
}

我应该认为
self
指的是调用类。

@BoltClock,我还认为
^{}
nil
不同,所以你不能像那样测试它的存在,对吗<代码>如果(指针锁定)不正确?块不是NSObjects的子类,尽管它们可以存储在容器中并被视为NSObjects的子类?@Stephen Furlani:我是说
^{}
是一个签名,但是的,块与无块(nil)不同。对于您的第二个问题,我尝试了
[^{}iskindof类:[NSObject类]]
,并且(令我惊讶的是)它返回
YES
if(pointerToBlock)
应该可以正常工作。事实上,如果
pointerToBlock
为NULL(与nil相同),如果执行
pointerToBlock()
操作,则会崩溃,这与传递nil对象不同,因此,如果块可以为NULL,则需要在调用块之前执行此检查,该块是在该方法中封装代码还是捕获方法的签名并以这种方式调用它?
self
指定义块的对象,即
programStart
方法内部的任何
self
。注意,在这种情况下,
self
会被保留,