fuz*_*oat 37 iphone cocoa-touch objective-c nsarray objective-c-blocks
我只是想,因为如果我创建其中两个然后将它们添加到NSArray中,你可以将块视为对象,是否有办法从数组中执行它们?
int (^Block_001)(void) = ^{ return 101; };
int (^Block_002)(void) = ^{ return 202; };
NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil];
Run Code Online (Sandbox Code Playgroud)
编辑:更新清晰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];
Run Code Online (Sandbox Code Playgroud)
Dav*_*ong 60
@KennyTM和@David是正确的,但您的代码可能有误.原因如下:
在创建NSArraywith对象时,会将retain对象放入其中.在块的情况下,它正在使用该Block_retain功能.这意味着数组保留了您创建的块,但是它们存在于堆栈中(块是可以在堆栈上创建的Objective-C对象的极少数示例之一,而无需深入研究荒谬的技巧).这意味着只要此方法退出,您的数组现在就指向垃圾,因为它指向的块不再存在.要做到这一点,你应该做:
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];
Run Code Online (Sandbox Code Playgroud)
通过调用copy块,您可以显式地将块移出堆栈并移到堆上,在方法/函数退出后它可以安全地保留.然后,在将块添加到阵列后,必须平衡copy(因为NARC规则)后续调用release.合理?
Dav*_*har 29
当然,您只需()像任何其他块一样调用它,但您需要对从中检索的值进行类型转换NSArray.这是一个例子(添加了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
Run Code Online (Sandbox Code Playgroud)
当然可以.
int (^x)(void) = [array objectAtIndex:0];
printf("%d\n", x()); // prints 101.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9687 次 |
| 最近记录: |