如果我使用@property(保留)Something *myVar;我可以使用 self.myVar 访问该变量...但是,有什么区别?
@property (retain) Something *myVar;
// this property declaration declares:
- (Something *)myVar;
// and
- (void)setMyIvar:(Something *)arg;
// and is accessible by dot syntax.
// it also declares and/or documents how the ivar is managed (copy, retain, etc.)
使用中:
// direct access to the ivar. zero additional overhead (with regard to accessing the ivar)
[myVar message];
// properties used with dot syntax invoke the accessor. therefore,
[self.myVar message];
// is the same as:
[[self myVar] message];
该属性的属性还向编译器提供有关如何合成访问器的说明。
我应该使用一种或另一种方法有充分的理由吗?
在 init 和 dealloc 中,直接访问 ivar - 您对对象的 ivar 的初始化和清理感兴趣,而不关心子类。在此处使用属性也可能会引入错误或未定义的行为。
对于其他情况,即当对象处于完全构造状态时,您应该始终使用访问器以保持一致性。如果子类覆盖访问器,直接访问 ivar 可能会破坏设计。
如果您想避免这种情况,则将 ivar 设为私有并且不要为其声明属性。如果你确实为它声明了一个属性,那么记录它是私有的;在这种情况下,我通常会写 @property (retain) Something * private_myIvar;。在这种情况下,使用属性来合成 ivar 的内存管理很方便。
当 ivar 是私有的时,您可以完全访问它。直接进入或通过私有财产进入是安全的。否则,假设您必须使用访问器。
如果 myIvar 被声明为私有且仅在初始化时创建,则可以完全避免声明属性。这将减少运行时开销(如果这很关键)。消息传递开销、保留/释放周期和原子将(自然)需要更多的执行时间。因此可以绕过它来提高性能。
可见性/维护。有时,从界面中隐藏 ivar 的维护/实现要少得多。在其他情况下,ivar 是类的实现细节,不应该是公共接口的一部分。在这种情况下,请考虑将其设为私有(在 objc 中有几种方法可以实现)。