Objective-C块 - 作为对象使用

4

参考以下代码,一旦将块放入数组中,如何获取该块对象并运行块中的实际代码。

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

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

-(void)programStart
{       

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

    id pointerToBlock = [array lastObject];
}
1个回答

7

按照以下方式调用:

void (^pointerToBlock)(void) = [array lastObject];
pointerToBlock(); // because ^ {} is void(^)(void)

如果您想直接调用pointerToBlock,则不能将其声明为id,因为编译器必须将其识别为块类型而不仅仅是一个对象。

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

我认为self指的是调用类。


@BoltClock,我也认为^{}不同于nil,所以你不能像那样测试它的存在,对吗?if (pointerToBlock)是不好的吗?块不是NSObjects的子类,尽管它们可以被存储在容器中并被视为这样。 - Stephen Furlani
@Stephen Furlani:我是在参考 ^ {} 作为签名,但是,块并不等同于没有块(nil)。就您的第二个问题而言,我尝试了 [^ {} isKindOfClass:[NSObject class]],出乎意料地它返回了 YES - BoltClock
1
如果 (pointerToBlock) 应该没问题。实际上,如果 pointerToBlock 是 NULL(与 nil 相同),如果你执行 pointerToBlock(),你会崩溃,不像给一个 nil 对象发送消息,所以在调用块之前,你需要进行这个检查,以防它为空。 - Daniel Dickison
如果我在块中调用一个方法,那么这个块是否封装了该方法的代码或者只是捕获了该方法的签名并以此方式调用它? - Luke Mcneice
5
self 指的是定义块的对象,即 programStart 方法内部的任何 self。请注意,在这种情况下,self 会被保留,可能会创建保留循环 - Daniel Dickison
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接