self.property在objective-c中的名称或_属性名称

时间:2012-11-16 17:19:28

标签: iphone ios ipad

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

非常感谢你的智慧!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

除了setter和getter之外,你应该避免使用initdealloc方法中的点表示法,理由是在一半构造或半毁坏的类上调用已发布的方法是不安全的。

特殊的风险是子类可能在其访问器中添加了逻辑。如果您在dealloc中调用访问者,那么您将在之后调用子类,因为它已被解除分配。如果您在init中调用访问者,那么您将在之前调用子类。它会自行初始化。

如果您有任何键值观察者,也会发生同样的事情 - 您调用了一个setter,然后他们会收到有关更改的警报,并且无论您当前的状态如何都会给您一个引用。如果你严格禁止继承,那么它甚至都不安全。

答案 2 :(得分:1)

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


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