因为刚接触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];
}
}
网友评论