在Objective C中你想要使用实例变量vs属性的情况是什么?有人可以提供真实的例子吗?
答案 0 :(得分:85)
实例变量对于类是唯一的。默认情况下,只有类和子类可以访问它。因此,作为面向对象编程的基本原理,实例变量(ivars)是私有的 - 它们由类封装。
相比之下,属性是一个公共值,可能与实例变量对应也可能不对应。如果你想公开一个ivar,你可能会做一个相应的财产。但与此同时,您希望保密的实例变量没有相应的属性,因此无法从类外部访问它们。您还可以使用与ivar不对应的计算属性。
如果没有属性,可以隐藏ivars。实际上,除非在公共标题中声明ivar,否则很难确定存在这样的ivar。
一个简单的比喻是一本收缩包装的书。属性可能是title
,author
或精装版与软装。 “ivars”将是本书的实际内容。在拥有本书之前,您无权访问实际文本;除非你拥有该课程,否则你无法访问ivars。
<小时/> 更有趣的是,属性更好地集成到运行时中。现代64位运行时将为访问器属性生成一个ivar,因此您甚至不需要创建ivar。属性实际上是方法:
// 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
ivar声明);它返回void,其名称只是 set 前置于变量名称。
因为它们是方法,所以您可以对它们进行动态调用。使用NSSelectorFromString()
和各种performSelector:
方法,您可以创建一个具有多种可能性的非常动态的程序。
最后,属性在Core Data和Key-Value Coding中广泛使用。 Core Data是一个高级框架,用于在SQLite数据库中存储数据,同时提供清晰的Obj-C前端; KVC在整个Core Data中使用,是一种访问属性的动态方式。它在编码/解码对象时使用,例如从XIB读取时。