属性与实例变量

时间:2011-08-14 16:00:08

标签: objective-c

  

可能重复:
  Is there a difference between an "instance variable" and a "property" in objective-c / cocoa / cocoa-touch?

在Objective C中你想要使用实例变量vs属性的情况是什么?有人可以提供真实的例子吗?

1 个答案:

答案 0 :(得分:85)

实例变量对于类是唯一的。默认情况下,只有类和子类可以访问它。因此,作为面向对象编程的基本原理,实例变量(ivars)是私有的 - 它们由类封装。

相比之下,属性是一个公共值,可能与实例变量对应也可能不对应。如果你想公开一个ivar,你可能会做一个相应的财产。但与此同时,您希望保密的实例变量没有相应的属性,因此无法从类外部访问它们。您还可以使用与ivar不对应的计算属性。

如果没有属性,可以隐藏ivars。实际上,除非在公共标题中声明ivar,否则很难确定存在这样的ivar。

一个简单的比喻是一本收缩包装的书。属性可能是titleauthor或精装版与软装。 “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读取时。