【问题标题】:Automatic Reference Counting & Synthesized Properties自动引用计数和综合属性
【发布时间】:2026-01-03 18:25:01
【问题描述】:

在使用 ARC for iOS 时,以下有什么区别吗?

@property (strong, nonatomic) NSObject *someProperty;
...
@synthesize someProperty;

//and then in the init method, either:
self.someProperty = aProperty;

//or
someProperty = aProperty;

我知道,如果没有 ARC,self.someProperty 实际上会调用合成的 setter 方法,该方法会向对象发送 retain 消息。但是现在有了 ARC,我是否使用点符号来设置这样的属性?

更一般地说,ARC 真的意味着我根本不必担心引用计数吗?或者在某些情况下我编写代码的方式可能会导致 ARC 出错?

【问题讨论】:

    标签: ios cocoa-touch memory-management automatic-ref-counting


    【解决方案1】:

    区别与没有 ARC 的情况相同:通过使用点表示法,您正在调用合成的 setter,而通过直接分配给 ivar,您将绕过 setter 方法。

    在 ARC 下,这两个选项在内存管理方面没有区别,但您仍然应该在这两个选项之间做出有意识的决定:例如,直接分配给 ivar 会绕过 KVO,而通过 setter 方法会稍微慢一些但在大多数情况下可能更安全,例如当您稍后决定创建属性 atomic 或覆盖设置器时。

    就个人而言,我总是使用属性表示法self.abc = ...;,除非init 通常需要绕过KVO。简而言之,使用与 ARC 之前相同的推理。

    【讨论】:

    • 访问器方法的另一个更微妙的好处是您可以在它们上设置断点以查看何时更改。