测试代码
typedef void (^blk)(void);
int main(int argc, const char * argv[]) {
@autoreleasepool {
__weak blk weakBlk = nil;
{
__block int a = 1;
blk obj = ^{a++;};
blk obj2 = [[[obj copy] copy] copy];
weakBlk = obj;
NSLog(@"before release %@", obj2);
NSLog(@"%@", weakBlk);
}
NSLog(@"%@", weakBlk);
}
return 0;
}
输出结果
2017-09-11 10:44:16.403783+0800 BlockTest[29910:11379291] before release <__NSMallocBlock__: 0x1004033a0>
2017-09-11 10:44:16.403949+0800 BlockTest[29910:11379291] <__NSMallocBlock__: 0x1004033a0>
2017-09-11 10:44:16.403968+0800 BlockTest[29910:11379291] (null)
结论:it's ok.
ps:retainCount
对于block对象真的不准确,不论在arc , 还是mrc下,持有block的对象是几个,输出的retainCount总是不会超过1。
最后提两个问题
- __block变量转换后的结构体为什么需要带有 __forwarding的成员变量? 2. 为什么不是在Block结构体中追加一个自动变量指针类型的变量?
网友评论