iOS-工作两年后,再看引用计数

2018-04-02  本文已影响12人  coder_那一抹刚吹过的风

因为刚接触iOS那会儿,iOS开发已经进入到ARC的模式,所以直接过渡到了ARC编程模式。今天跟同事讨论问题,发现自己有些许理解有很大问题。不多BB,看代码。

@interface People()
@property (nonatomic, retain) NSArray *arr;
@end
@implementation People
- (instancetype)init {
    self = [super init];
    if (self) {
        self.arr = @[@"hello world"];
        NSLog(@"%ld", [self.arr retainCount]);
    }  
    return self;
}
@end

还是上面的代码,我们修改少许,改变self成立内部的代码为下面的代码
1

        _arr = @[@"hello world"];
        NSLog(@"%ld", [_arr retainCount]);

2

        _arr = @[@"hello world"];
        NSLog(@"%ld", [_arr retainCount]);

3

        self.arr = @[@"hello world"];
        NSLog(@"%ld", [_arr retainCount]);

公布一下上面的答案,2,1,1,2.
上面的答案开始我是很不能理解了。还是里一位大佬(不语)的耐心讲解,解开了心中的诸多疑惑。

在这里说明一下,如果你对@property还有疑问,我翻看我早先写的一篇文章,这里有关于Property的相关说明。来,咱们看源码,我跟大家分析一波。
首先,着重强调:

对象调动alloc方法,会自动让自己的引用计数+1

成员变量赋值不会影响对象的引用计数

其实这里我们主要给出@property生成的setter方法,大家应该就会有中豁然开朗的感觉。

- (void)setArr: (NSArray *)arr {
     if(_arr != arr) {
             [_arr release];
             _arr = [arr retain];
      }
}
上一篇 下一篇

猜你喜欢

热点阅读