可能重复:
What describes @property(…) best? What's that actually good for?
如果我在类接口中声明一个变量,我可以在我的类的任何地方使用这样的变量。真棒。
如果我使用@property (retain) Something *myVar;
我可以使用self.myVar
访问该变量...但是,有什么区别?我应该使用一种方法还是另一种方法?
答案 0 :(得分:5)
简短回答:封装内存管理。
更长的答案:如果您想稍后使用它,则需要建立对象的所有权。如果你想在以后使用它,你需要用它来引用它,并且保留该引用的一个好地方是在一个实例变量中。
每次为此分配新值时,都可以处理所有权声明(即保留和释放),但这样会留下大量重复且容易出错的样板代码遍布整个地方,像水果蛋糕中的樱桃。当(不是)出现问题时,这种混乱很难调试。因此,将这些代码包装在访问器方法中会好得多,所以你可以编写一次然后忘记它。
但是访问器方法也大多是样板文件,所以我们使用@property声明来自动创建它们,而不是手工编写它们。
修改:Apple的Memory Management Guide提供了很多详细信息,详细介绍了@property在幕后制作的访问者方法。
答案 1 :(得分:1)
如果我使用@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 - 你对初始化和清理对象的ivars感兴趣,而不关心子类。在这里使用属性也可能会引入错误或未定义的行为。
对于其他情况,也就是说,当对象处于完全构造状态时,应始终使用访问器来保持一致性。如果一个子类重写了一个访问器,那么直接访问ivar可能会破坏设计。
如果你想避免这种情况,那么将ivar设为私有,不要为它声明属性。如果您确实为它声明了一个属性,那么请记录它是私有的;在这种情况下,我通常会写@property (retain) Something * private_myIvar;
。在这种情况下,使用属性合成化ivar的内存管理很方便。
当ivar是私有的时,您可以完全访问它。直接或私人财产是安全的。否则,假设您必须使用访问者。
如果myIvar被声明为private并且仅在初始化时创建,则可以避免完全声明属性。这将减少运行时开销(如果这很关键)。消息传递开销,保留/释放周期和原子将(自然地)需要更多的执行时间。因此可以绕过它以提高性能。
能见度/维护。有时,将ivar隐藏在界面中的维护/实施要少得多。在其他情况下,ivar是类的实现细节,不应该是公共接口的一部分。在这种情况下,请考虑将其设为私有(有几种方法可以在objc中完成此操作)。
答案 2 :(得分:0)
使用@property访问你的ivars,为你释放和保留对象的许多重复代码。您不必使用它们。这只是很多教程,让对于平台新手的人来说很简单。