2012-11-16 31 views
2

我明白两者之间的区别:self.propertyName使用访问方法,而_propertyName直接访问实例变量。所以据我了解,只有时间你不要想要使用self.propertyName是在属性的存取方法,因为它会导致无限循环。只要遵循这个规则,是否可以,并且为了保持一致性,可能每次都需要在类方法中获取/设置该属性时使用self.propertyName?self.propertyName vs _propertyName in objective-c

非常感谢您的智慧!

+0

是的。请参阅[使用访问器方法设置属性值](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW5 )和[不要在初始化方法和dealloc中使用访问器方法](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/) uid/TP40004447-SW6),因此您应该避免在'init'方法和'dealloc'方法中使用accessor方法。 – Rob

+0

ahhh dealloc,这是有道理的。谢谢! – BeachRunnerFred

+0

“_propertyName直接访问属性” - 嗯,不,它直接访问底层*实例变量*。 – 2012-11-16 17:40:30

回答

3

除了setter和getter,你应该避免在你的initdealloc方法中的点符号,理由是它不安全在一半建造或一半被毁的类上调用已发布的方法。

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

如果您有任何键值观察员,您也可能会发生同样的事情 - 您调用setter,然后他们会收到有关更改的提醒并给出对您的引用,而不管您当前的状态如何。因此,如果严格禁止子类化,它甚至不安全。

+0

优点! – BeachRunnerFred

3

是的,你发现了。一致性是最重要的一件事。我的个人偏好是尽可能使用点符号,但如果需要使用直接实例变量(例如,在getter/setters中)。

说了这么一句话,如果你在属性设置器方法中也要小心,因为self.property = val内的setProperty:也会调用一个无限循环;解决方案是_property = val

1

正确使用性能将进一步一致性(如说的)也允许更好的子类:)


还是......在某些情况下,例如..在线程上下文中,你想要的东西是原子的,所以,你必须回退到var