2

我了解两者之间的区别:self.propertyName使用访问器方法而_propertyName直接访问实例变量。因此,据我了解,您不想使用的唯一一次在属性的访问器方法中,因为它会导致无限循环。只要我遵循该规则,每次需要在类方法中获取/设置该属性时使用 self.propertyName 是否可以,并且可能出于一致性的考虑?self.propertyName

非常感谢你的智慧!

4

3 回答 3

3

与 setter 和 getter 一样,你应该避免在你的initdealloc方法中使用点符号,因为在一个半构造或半破坏的类上调用已发布的方法是不安全的。

特殊的风险是子类可能已将逻辑添加到其访问器中。如果您调用访问器,dealloc那么您将在子类自行释放调用它。如果您调用访问器,init那么您将在子类初始化之前调用它。

如果你有任何 key-value 观察者,同样的事情也会发生——你调用一个 setter,然后他们会收到变化的警报,并不管你当前的状态如何,都会给你一个参考。因此,如果您严格禁止子类化,这甚至是不安全的。

于 2012-11-16T17:35:49.767 回答
3

是的,你很准。在所有这些中,一致性是最重要的。我个人的偏好是尽可能使用点符号,但如果需要(例如,在 getter/setter 中)使用直接实例变量。

话虽如此,如果您也在属性设置器方法中,您要小心,因为self.property = valinsidesetProperty:也会调用无限循环;解决方案是_property = val

于 2012-11-16T17:28:56.483 回答
1

正确使用属性将进一步保持一致性(如前所述)也允许更好的子类化:)


仍然......在某些情况下......例如在你希望东西是原子的线程上下文中,你必须回退到var

于 2012-11-16T17:34:31.270 回答