Property vs Instance Variable
Possible Duplicate:
Is there a difference between an"instance variable" and a"property" in objective-c / cocoa / cocoa-touch?
在目标C中,您希望使用实例变量vs属性的情况是什么?有人能提供一个真实的例子吗?
- "实例变量"和"属性"在objective-c/cocoa/cococa touch中是否存在差异?和stackoverflow.com/questions/719788
实例变量对于类是唯一的。默认情况下,只有类和子类可以访问它。因此,作为面向对象编程的基本原理,实例变量(ivars)是私有的,由类封装。
相反,属性是一个公共值,可能与实例变量对应,也可能不对应。如果你想公开一个IVAR,你可能会得到一个相应的属性。但同时,希望保持私有的实例变量没有相应的属性,因此不能从类外部访问它们。您还可以具有与IVAR不对应的计算属性。
如果没有财产,IVAR可以隐藏起来。事实上,除非在公共报头中声明了一个IVAR,否则很难确定这样的IVAR是否存在。
一个简单的类比就是一本收缩包装的书。一个属性可能是title、author或精装版与软封面。"ivars"是本书的实际内容。除非你拥有这本书,否则你无法访问实际的文本;除非你拥有这门课,否则你无法访问ivar。
更有趣的是,属性更好地集成到运行时中。现代64位运行时将为访问器属性生成一个ivar,因此您甚至不需要创建该ivar。属性实际上是方法:
1 2 3
| // This is not syntactically correct but gets the meaning across
(self.variable) == ([self variable];)
(self.variable = 5;) == ([self setVariable:5];) |
对于每个属性,都有两种方法(除非属性声明为readonly,在这种情况下只有一种方法):getter返回与ivar相同的类型,并且与ivar同名,以及setter(不是用readonlyivar声明);它返回void,并且它的名称只是预先设置为o变量名。
因为它们是方法,所以您可以对它们进行动态调用。使用NSSelectorFromString()和各种performSelector:方法,您可以制作一个具有许多可能性的非常动态的程序。
最后,属性在核心数据中得到了广泛的应用,并带有键值编码。核心数据是一个高级框架,用于将数据存储在sqlite数据库中,同时提供一个清晰的obj-c前端;kvc在整个核心数据中使用,是访问属性的动态方式。它用于对对象进行编码/解码,例如从XIB读取时。
- 您可以在类扩展中声明属性以使它们"私有",同时受益于它们提供的内存管理封装和样板代码消除。
- 是的,但是电弧呢……不再需要"内存管理",所以使用@property还有优势吗?
- @Vandutran:属性实际上与内存管理无关。它们是1/3语义,在访问值(和控制访问)方面是2/3功能。它们还具有运行时优势,正如我在文章后半部分中所描述的那样,使用ivars不能做到这一点,因为@property会产生方法,而运行时系统使用方法。
- 除非您手动操作,否则ivars不会保留。属性可以自动保留它。如果一个方法返回的指针需要您保留它,但该方法在之后释放它,则您的程序可能会崩溃。
- 的确!因此,需要通过在某些方法中调用"_property"而不是"self.property"来设置/获取,因为这通常是偶尔看到的错误访问的原因。
- 属性是否也在.m private中声明?
- 对。自从我写下这个答案以来,属性/ivar发生了一些变化……现在所有属性都带有隐式ivar(@property var也提供了ivar _var。在.m中声明的属性现在是创建私有字段的"最佳"方法。
- @Feifanz,那么在2015年应该再使用ivars吗?
- @伊利亚诺弗雷·阿法克,有了斯威夫特,你就不能创造一个没有"财产"的IVAR。对于objc,没有"应该"或"不应该";上面所述的原因仍然有效,这取决于您希望代码如何工作。
- 请参阅:-onestopios.com/tutorials/…
- 回答得很好。这个答案比另一个问题的答案好。阿飞,你对伊瓦尔的看法是错误的。它们可以从实现外部访问。请访问stackoverflow.com/a/36577175/5175709,请告诉我们什么是正确的。
- 为什么是is not syntactically correct but gets the meaning across?我以为self.variable和[self variable];是等价的?