从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_retain
function。 这意味着该数组保留了您创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.
- 当表重新出现时,UITableView不会自动取消选定的行
- 查找文件的大小
- 在iOS上检测飞行模式
- 在objective-c / cocoa-touch中有一个方便的function来find最小的数字吗?
- 新的自动引用计数机制如何工作?
- 具有UITapGestureRecognizer的视图内的UIButton
- 在iPhone上用于SQLite的最佳Cocoa / Objective-C包装库
- 检测是否应用:didReceiveRemoteNotification:fetchCompletionHandler:通过点击Notification Center中的通知来调用
- 如果用户点击屏幕键盘,我怎样才能closures键盘?