再次讨论一下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操作。

下面两种写法是等价的:

 等价于

posted @ 2015-12-26 17:42  Dalink  阅读(114)  评论(0编辑  收藏  举报