参考以下代码,一旦将块放入数组中,如何获取该块对象并运行块中的实际代码。
另一个问题:如果我在块中调用一个方法,那么该块是否封装了该方法中的代码或者只是捕获了该方法的签名并以那种方式调用它?
-(void)blockCalledMethod
{
NSLog(@"Hello World");
}
-(void)programStart
{
NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];
id pointerToBlock = [array lastObject];
}
^{}
不同于nil
,所以你不能像那样测试它的存在,对吗?if (pointerToBlock)
是不好的吗?块不是NSObjects的子类,尽管它们可以被存储在容器中并被视为这样。 - Stephen Furlani^ {}
作为签名,但是,块并不等同于没有块(nil)。就您的第二个问题而言,我尝试了[^ {} isKindOfClass:[NSObject class]]
,出乎意料地它返回了YES
。 - BoltClockself
指的是定义块的对象,即programStart
方法内部的任何self
。请注意,在这种情况下,self
会被保留,可能会创建保留循环。 - Daniel Dickison