block实战讲解(2)
2016-04-04 本文已影响766人
酷酷的哀殿
在ARC环境下,下面的代码的执行结果是什么?
-(NSArray*) getBlockArray
{
int num = 916;
return [NSArray arrayWithObjects:
^{ NSLog(@"this is block 0:%i", num); },
^{ NSLog(@"this is block 1:%i", num); },
^{ NSLog(@"this is block 2:%i", num); },
nil];
}
- (void) forTest
{
int a = 10;
int b = 20;
}
- (void)test
{
NSArray* blockArr = [self getBlockArray];
[self forTest];
void (^blockObject)(void);
for(blockObject in blockArr){
blockObject();
}
答:
输出 this is block 0:916 后闪退
解析:
arrayWithObjects 方法只会copy第0个block,导致该block的类型修改为**NSMallocBlock**,后面的block被保持初始类型 NSStackBlock 并会在后续被系统回收内存。后面的for循环调用该指针时,会因为野指针而crash。