You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:57:04