Objective-C ARC环境下,构造方法中直接赋值_foo会自动增引用计数吗?
Objective-C MRC下实例变量直接赋值与属性赋值的引用计数差异
先明确属性定义:
@property (nonatomic, readwrite, retain) NSObject *foo;
直接赋值实例变量的情况
看你给出的构造方法:
- (instancetype)initWithSomeObject:(NSObject *)foo { self = [super init]; if (self != nil) { _foo = foo; } return self; }
这种直接给_foo赋值的写法不会触发retain属性的自动引用计数增加逻辑。因为属性的retain语义是通过自动生成的setter方法实现的,直接操作实例变量相当于绕开了setter,自然不会执行retain操作。
属性赋值的情况
如果你写self.foo = foo;,这会调用属性的setter方法。按照retain属性的语义,setter内部会先对旧值执行release,再对新传入的foo执行retain,所以foo的引用计数会+1。
为什么团队成员用直接赋值
在MRC的初始化场景下,用self.foo = foo;会多一次不必要的retain/release操作:假设调用方传入的foo已经是被持有状态(比如调用方通过alloc/init创建后传入),setter的retain会让引用计数额外+1,后续在dealloc里还要release一次,虽然最终引用计数能平衡,但中间多了冗余操作。直接赋值实例变量可以避免这个问题,不过要注意确保传入的foo的生命周期能覆盖当前实例的使用,或者后续要正确管理该变量的引用计数。
内容的提问来源于stack exchange,提问作者Anton Tropashko
相关产品推荐
相关产品推荐

