再次讨论一下block的变量捕获特性
如果一个block访问一个对象A的成员B,那么block会使B的引用计数加一?其实block会使A的引用计数加一。这是为什么呢?
@interface ViewController () { TSObject *tsObject; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; tsObject = [[TSObject alloc] init]; NSLog(@"成员的引用计数-->%ld", CFGetRetainCount((__bridge CFTypeRef)tsObject)); NSLog(@"自己的引用计数-->%ld", CFGetRetainCount((__bridge CFTypeRef)self)); NSLog(@"——————————————————————————————————"); MyBlock localBlock1 = ^(){ NSLog(@"成员的引用计数-->%ld", CFGetRetainCount((__bridge CFTypeRef)tsObject)); NSLog(@"自己的引用计数-->%ld", CFGetRetainCount((__bridge CFTypeRef)self)); }; localBlock1(); }
@end
打印结果:
[2913:269344] 成员的引用计数-->1 [2913:269344] 自己的引用计数-->25 [2913:269344] ————————————————————————————— [2913:269344] 成员的引用计数-->1 [2913:269344] 自己的引用计数-->27
可以观察到,自己的引用计数自增两次,而成员的引用计数并没有变化。
这是因为,访问成员B相当于进行A->B操作。
下面两种写法是等价的:
等价于