Possible Duplicate:
Is there a difference between an "instance variable" and a "property" in objective-c / cocoa / cocoa-touch?
在Objective C中,您希望使用实例变量vs属性的情况是什么?有人能提供一个真实的例子吗?
Possible Duplicate:
Is there a difference between an "instance variable" and a "property" in objective-c / cocoa / cocoa-touch?
在Objective C中,您希望使用实例变量vs属性的情况是什么?有人能提供一个真实的例子吗?
实例变量对于类是唯一的.默认情况下,只有类和子类可以访问它.因此,作为面向对象编程的基本原则,实例变量(IVAR)是私有的,它们由类封装.
相反,属性是一个公共值,它可能对应于实例变量,也可能不对应于实例变量.如果你想公开一个ivar,你可能会创建一个相应的属性.但同时,希望保持私有的实例变量没有相应的属性,因此不能从类外部访问它们.您还可以拥有与ivar不对应的计算(computed)属性.
如果没有财产,IVAR可以隐藏起来.事实上,除非在公共头中声明ivar,否则甚至很难确定这样的ivar是否存在.
一个简单的类比就是一本收缩包装的书.一个属性可能是title
、author
或精装与软装."ivars"将是这本书的实际内容.在你拥有这本书之前,你无法接触到真正的文本;除非你拥有这个班级,否则你无法访问IVAR.
// This is not syntactically correct but gets the meaning across
(self.variable) == ([self variable];)
(self.variable = 5;) == ([self setVariable:5];)
对于每个属性,都有两种方法(除非属性声明为readonly
,在这种情况下只有一种方法):getter和setter(不使用readonly
ivar声明),前者返回与ivar相同的类型,后者与ivar同名;它返回void,其名称仅在变量名前加set.
因为它们是方法,所以可以对它们进行动态调用.使用NSSelectorFromString()
和各种performSelector:
方法,您可以制作一个具有多种可能性的非常动态的程序.
最后,属性广泛用于核心数据中,并具有Key-Value Coding个属性.Core Data是一个高级框架,用于在SQLite数据库中存储数据,同时提供清晰的Obj-C前端;KVC用于整个核心数据,是访问属性的动态方式.它用于编码/解码对象,例如从XIB读取时.