属性与实例variables

可能重复:
在objective-c / cocoa / cocoa-touch中,“实例variables”和“属性”是否有区别?

目标C中你想要使用实例variablesvs属性的情况是什么? 有人可以提供一个真实的例子吗?

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

相比之下,一个属性是一个公共值,可能会或可能不会对应一个实例variables。 如果你想让伊娃公开,你可能会做出相应的财产。 但是与此同时,你希望保持私有的实例variables没有相应的属性,所以它们不能从类之外访问。 你也可以有一个计算属性,不对应于伊娃…

没有财产,ivars可以隐藏起来。 事实上,除非在公众头上宣布伊娃,否则甚至很难确定这样的伊娃是否存在。

一个简单的比喻就是一本收缩包装的书。 一个属性可能是titleauthor或精装与平装书。 “伊娃”将是这本书的实际内容。 直到你拥有这本书,你才能获得真正的文本。 除非你拥有这个class级,否则你无法使用这个class级。


更有趣的是,属性更好地集成到运行时。 现代的64位运行时将为访问者属性生成一个ivar,所以你甚至不需要创buildivar。 属性实际上是方法:

 // This is not syntactically correct but gets the meaning across (self.variable) == ([self variable];) (self.variable = 5;) == ([self setVariable:5];) 

对于每个属性,有两个方法(除非该属性被声明为readonly ,在这种情况下只有一个):有一个getter ,它返回与伊娃相同的types,与伊娃相同的名称作为二传手 ,这是没有宣布readonly ivar; 它返回void,并且它的名字被简单地添加到variables名称后面。

因为它们是方法,所以可以对它们进行dynamic调用。 使用NSSelectorFromString()和各种performSelector:方法,你可以制作一个dynamic程序,有很多种可能性。

最后,属性被广泛用于核心数据和键值编码 。 核心数据是一个高级框架,用于将数据存储在SQLite数据库中,同时提供清晰的Obj-C前端; KVC在核心数据中使用,是一种访问属性的dynamic方法。 它用于编码/解码对象时,比如从XIB读取时。