自动引用计数和合成属性

3
在iOS中使用ARC时,下面两种方式有什么不同?
@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 出错?
1个回答

6
区别与没有ARC的情况一样:使用点表示法时,您正在调用合成的setter方法;而直接分配给ivar,则绕过了setter方法。
在ARC下,这两个选项在内存管理方面没有区别,但仍应在这两个选项之间做出明智的选择:例如,直接分配给ivar将绕过KVO,而通过setter方法略微慢一些,但在大多数情况下可能更安全,例如当您稍后决定使属性为atomic或覆盖setter方法时。
个人而言,我总是使用属性表示法self.abc = ...;,除非在init中,这时绕过KVO通常是可取的。简而言之,使用与ARC之前相同的推理方式。

1
另一个更微妙的访问器方法的好处是,您可以在它们上面设置断点以查看何时更改了某些内容。 - Catfish_Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接