脑子生锈,理解能力速降,这本书怕是要读好几遍。不整篇抄了,说说里面的问题,或者说理解起来需要蛮久的东西记录一下。
一:ARC无效时,再不同的作用域对block赋值时,如果不使用copy,block不会复制到堆上,那么当作用域结束时block被释放,调用block就会报错。但是按照书上的例子实验,并没有报错。我按照思路复现了书上讲到的场景,如下:
void setBlock(blk_a * blk) {
id array = [[NSMutableArray alloc] init];
//不使用copy,打印的blk是 __NSMallocBlock__ 类型
*blk = [^(id obj){
[array addObject:obj];
NSLog(@"array count = %ld",[array count]);
} copy];
//不使用copy,打印的blk是 __NSStackBlock__ 类型
// *blk = ^(id obj){
// [array addObject:obj];
// NSLog(@"array count = %ld",[array count]);
// };
NSLog(@"%@",[*blk class]);
NSLog(@"%p",blk);
}
int main(int argc, const char * argv[]) {
blk_a blk = nil;
setBlock(&blk);
NSLog(@"%p",blk);
blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);
blk([[NSObject alloc] init]);
NSLog(@"%@",[blk class]);
NSLog(@"%p",blk);
return 0;
}
网友评论