关于C#:属性与实例变量

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属性的情况是什么?有人能提供一个真实的例子吗?


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

相反,属性是一个公共值,可能与实例变量对应,也可能不对应。如果你想公开一个IVAR,你可能会得到一个相应的属性。但同时,希望保持私有的实例变量没有相应的属性,因此不能从类外部访问它们。您还可以具有与IVAR不对应的计算属性。

如果没有财产,IVAR可以隐藏起来。事实上,除非在公共报头中声明了一个IVAR,否则很难确定这样的IVAR是否存在。

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