属性与实例variables
可能重复:
在objective-c / cocoa / cocoa-touch中,“实例variables”和“属性”是否有区别?
目标C中你想要使用实例variablesvs属性的情况是什么? 有人可以提供一个真实的例子吗?
一个实例variables对于一个类是唯一的。 默认情况下,只有类和子类可以访问它。 因此,作为面向对象编程的基本原则,实例variables(ivars)是私有的 – 它们被类封装。
相比之下,一个属性是一个公共值,可能会或可能不会对应一个实例variables。 如果你想让伊娃公开,你可能会做出相应的财产。 但是与此同时,你希望保持私有的实例variables没有相应的属性,所以它们不能从类之外访问。 你也可以有一个计算属性,不对应于伊娃…
没有财产,ivars可以隐藏起来。 事实上,除非在公众头上宣布伊娃,否则甚至很难确定这样的伊娃是否存在。
一个简单的比喻就是一本收缩包装的书。 一个属性可能是title
, author
或精装与平装书。 “伊娃”将是这本书的实际内容。 直到你拥有这本书,你才能获得真正的文本。 除非你拥有这个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读取时。
- 在没有UITableViewController的情况下刷新UITableView
- 从NSDate对象获取UTC时间和本地时间
- UITableView / UITableViewCell挑战与iOS7上的iPad的透明背景
- 如何在UIWebView中caching内容以便稍后加载?
- 故事板中的Modal和Push segue有什么区别?
- 在旋转界面方向的同时将contentOffset保留在UICollectionView中
- 如果用户点击屏幕键盘,我怎样才能closures键盘?
- ARC禁止在结构或联合中使用Objective-C对象,尽pipe标记了文件-fno-objc-arc
- 有没有办法清除UIImage类使用的caching?