我写了一些代码使用objective-c块,但结果让我很困惑。
@interface MyTest : NSObject
@end
@implementation MyTest
- (void)test {
NSArray *array = [self array1]; // ok
// NSArray *array = [self array2];// crash
// NSArray *array = [self array3];// ok again
dispatch_block_t block0 = (dispatch_block_t)[array objectAtIndex:0];
block0();
dispatch_block_t block1 = (dispatch_block_t)[array objectAtIndex:1];
block1();
}
- (NSArray *)array1 {
int a = 10;
NSMutableArray *array = [NSMutableArray array];
[array addObject:^{
NSLog(@"block0: a is %d", a);
}];
[array addObject:^{
NSLog(@"block1: a is %d", a);
}];
return array;
}
- (NSArray *)array2 {
int a = 10;
return [NSArray arrayWithObjects:^{
NSLog(@"block0: a is %d", a);
}, ^{
NSLog(@"block1: a is %d", a);
}, nil];
}
- (NSArray *)array3 {
int a = 10;
return [NSArray arrayWithObjects:^{
NSLog(@"block0: a is %d", a);
},[^{
NSLog(@"block0: a is %d", a);
} copy], nil];
}
@end
我很困惑:
- 为什么array2崩溃?array1 和 array2 之间的真正区别是什么?
- 我读过一些文章说块复制会将块从堆栈移动到堆,但是在方法 array1 中,我不复制它并且它仍然有效。在array3中,我只需复制第二个块就可以了。为什么 ?
- 使用块时必须在哪里使用副本?
顺便说一句,我在 ARC 下的 Xcode 4.6 中运行代码。谢谢