2011-04-09 103 views
6

可能重复:
What describes @property(…) best? What's that actually good for?为什么我应该使用@properties?

如果我宣布我的类接口的变量,我可以在任何地方对我的类使用这些变量。真棒。

如果我使用@property (retain) Something *myVar;我可以通过self.myVar访问该变量...但是,有什么区别?有没有很好的理由我应该使用这种或那种方法?

+0

我相信它与你是否想要创建getter/setter方法有关,但不要在此引用我。这是可可老兵之间的常识,我敢肯定有人会很快回答这个问题:) – 2011-04-09 04:59:50

回答

5

简答:内存管理封装。

较长的回答:如果您想稍后使用,则需要建立对象的所有权。如果你想稍后使用它,你需要一个引用它来做到这一点,并且保持引用的一个好地方是在一个实例变量中。

可能每次您为所有权分配一个新的值(即保留和释放),但会留下许多重复且麻烦的样板代码,如樱桃在一个水果蛋糕。当(不是如果)出现错误时,这种混乱很难进行调试。因此,将代码包装在访问器方法中会更好,因此您可以编写一次,然后将其忘掉。

但是accessor方法也大多是样板文件,所以我们使用@property声明来自动创建它们,而不是手工编写它们。

编辑:苹果的Memory Management Guide提供了详细的关于什么用@财产所产生的存取方法做幕后很多

+0

因此,我提到的第一种方法如果一个对象没有建立所有权,因此我可能在将来失去它?我想我只会使用一切= =的属性。最后一件事:如果我在Dealloc方法中使用self.myProperty = nil(当我不再需要它时),我很好,对吧?我不必说[self.myProperty发布]或任何东西? – Voldemort 2011-04-09 05:10:19

+0

不,通过使用+ alloc,-copy或-mutableCopy创建一个对象,或者通过发送一个-retain消息来建立所有权。不管你如何建立所有权,你必须通过发送一条消息来放弃它。还有一点就是 - 每次你给实例变量赋一个新的值时,你需要释放旧的值,并且你需要确保所有这些所有权声明保持平衡。 – 2011-04-09 05:13:02

+0

通过避免建立所有权的创建方法,或者在必须使用它们时使用-autorelease,并简单地让属性分配处理其余部分,这是最容易的。 – 2011-04-09 05:14:31

0

使用@property来访问你的ivars,会为你释放和保留许多对象的重复代码。你不必使用它们。这只是很多教程使得对于新平台的人来说很简单。

1

如果我使用@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中使用这个方法)。