从NSArray执行块?

我只是想,因为你可以把块像对象,如果我创build两个,然后将它们添加到一个NSArray有没有办法从数组中执行它们?

int (^Block_001)(void) = ^{ return 101; }; int (^Block_002)(void) = ^{ return 202; }; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; 

编辑:更新清晰Per @ davedelong的优秀答案

 int (^Block_001)(void) = [^{ return 101; } copy]; int (^Block_002)(void) = [^{ return 202; } copy]; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; [Block_001 release]; [Block_002 release]; 

当然,你只需要像()一样调用它,但是你需要对从NSArray检索的值进行types转换。 这里是一个例子(添加了typedef,否则我的头痛):

 typedef int (^IntBlock)(void); IntBlock Block_001 = ^{ return 101; }; IntBlock Block_002 = ^{ return 202; }; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; int x = ((IntBlock)[array objectAtIndex:0]) (); // now x == 101 

@KennyTM和@David是正确的,但是你的代码可能是错误的。 原因如下:

当用对象创build一个NSArray时,它将retain放入它的对象。 在块的情况下,它使用Block_retainfunction。 这意味着该数组保留了您创build的块,但它们位于堆栈中 (块是Objective-C对象的一个​​非常罕见的例子,可以在堆栈中创build而不需要研究荒谬的技巧)。 这意味着只要此方法退出,您的数组现在指向垃圾,因为它指向的块不再存在 。 为了做到这一点,你应该这样做:

 int (^Block_001)(void) = [^{ return 101; } copy]; int (^Block_002)(void) = [^{ return 202; } copy]; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; [Block_001 release]; [Block_002 release]; 

通过在块上调用copy ,你明确地将块从堆栈移到堆上,在方法/函数退出后它可以安全地保留。 然后,在将块添加到数组后,必须平衡copy (由于NARC规则)和随后的release调用。 合理?

当然可以。

 int (^x)(void) = [array objectAtIndex:0]; printf("%d\n", x()); // prints 101.