实例变量对于类来说是唯一的。默认情况下,只有类和子类可以访问它。因此,作为面向对象编程的基本原则,实例变量 (ivars) 是私有的——它们由类封装。
相比之下,属性是公共值,可能对应也可能不对应于实例变量。如果你想公开一个 ivar,你可能会创建一个相应的属性。但同时,您希望保持私有的实例变量没有相应的属性,因此无法从类外部访问它们。您还可以拥有与 ivar 不对应的计算属性。
如果没有财产,ivars 可以被隐藏。事实上,除非在公共标头中声明 ivar,否则很难确定这样的 ivar 是否存在。
一个简单的比喻是一本收缩包装的书。属性可能是title
, author
或精装与平装。 “ivars”将是本书的实际内容。在您拥有这本书之前,您无法访问实际文本;除非您拥有该课程,否则您无权访问 ivars。
More interestingly, properties are better integrated into the runtime. Modern 64-bit runtimes will generate an ivar for accessor properties, so you don't even need to create the ivar. Properties are in fact methods:
// 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(没有用readonly
伊瓦尔);它返回 void 并且它的名字很简单set添加到变量名前面。
因为它们是方法,所以您可以动态调用它们。使用NSSelectorFromString() http://www.cocoadev.com/index.pl?NSSelectorFromString以及各种performSelector: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html方法,您可以制作一个具有多种可能性的非常动态的程序。
最后,属性在核心数据中被广泛使用键值编码 http://cupsofcocoa.wordpress.com/2011/05/09/objective-c-lesson-13-key-value-coding/。 Core Data 是一个先进的框架,用于在 SQLite 数据库中存储数据,同时提供清晰的 Obj-C 前端; KVC 在整个 Core Data 中使用,是一种访问属性的动态方式。它在编码/解码对象时使用,例如从 XIB 读取时。