可能重复:
What describes @property(…) best? What's that actually good for?为什么我应该使用@properties?
如果我宣布我的类接口的变量,我可以在任何地方对我的类使用这些变量。真棒。
如果我使用@property (retain) Something *myVar;
我可以通过self.myVar
访问该变量...但是,有什么区别?有没有很好的理由我应该使用这种或那种方法?
可能重复:
What describes @property(…) best? What's that actually good for?为什么我应该使用@properties?
如果我宣布我的类接口的变量,我可以在任何地方对我的类使用这些变量。真棒。
如果我使用@property (retain) Something *myVar;
我可以通过self.myVar
访问该变量...但是,有什么区别?有没有很好的理由我应该使用这种或那种方法?
简答:内存管理封装。
较长的回答:如果您想稍后使用,则需要建立对象的所有权。如果你想稍后使用它,你需要一个引用它来做到这一点,并且保持引用的一个好地方是在一个实例变量中。
您可能每次您为所有权分配一个新的值(即保留和释放),但会留下许多重复且麻烦的样板代码,如樱桃在一个水果蛋糕。当(不是如果)出现错误时,这种混乱很难进行调试。因此,将代码包装在访问器方法中会更好,因此您可以编写一次,然后将其忘掉。
但是accessor方法也大多是样板文件,所以我们使用@property声明来自动创建它们,而不是手工编写它们。
编辑:苹果的Memory Management Guide提供了详细的关于什么用@财产所产生的存取方法做幕后很多。
因此,我提到的第一种方法如果一个对象没有建立所有权,因此我可能在将来失去它?我想我只会使用一切= =的属性。最后一件事:如果我在Dealloc方法中使用self.myProperty = nil(当我不再需要它时),我很好,对吧?我不必说[self.myProperty发布]或任何东西? – Voldemort 2011-04-09 05:10:19
不,通过使用+ alloc,-copy或-mutableCopy创建一个对象,或者通过发送一个-retain消息来建立所有权。不管你如何建立所有权,你必须通过发送一条消息来放弃它。还有一点就是 - 每次你给实例变量赋一个新的值时,你需要释放旧的值,并且你需要确保所有这些所有权声明保持平衡。 – 2011-04-09 05:13:02
通过避免建立所有权的创建方法,或者在必须使用它们时使用-autorelease,并简单地让属性分配处理其余部分,这是最容易的。 – 2011-04-09 05:14:31
使用@property来访问你的ivars,会为你释放和保留许多对象的重复代码。你不必使用它们。这只是很多教程使得对于新平台的人来说很简单。
如果我使用@property(retain)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是私人的时候,您可以完全访问它。直接访问或私有财产是安全的。否则,假定您必须使用访问器。
如果myIvar声明为私有,并且仅在初始化时创建,则可以避免完全声明属性。这将减少运行时间开销(如果这很关键)。消息开销,保留/释放周期以及原子(自然)需要更多的执行时间。所以它可以绕过来提高性能。
能见度/维护。有时候,从界面上隐藏伊娃的维护/实施远远不够。在其他情况下,ivar是类的实现细节,不应该是公共接口的一部分。在这种情况下,考虑将其设置为私有的(有几种方法可以在objc中使用这个方法)。
我相信它与你是否想要创建getter/setter方法有关,但不要在此引用我。这是可可老兵之间的常识,我敢肯定有人会很快回答这个问题:) – 2011-04-09 04:59:50