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是否存在.

一个简单的类比就是一本收缩包装的书.一个属性可能是titleauthor或精装与软装."ivars"将是这本书的实际内容.在你拥有这本书之前,你无法接触到真正的文本;除非你拥有这个班级,否则你无法访问IVAR.


More interestingly, properties are better integrated into the runtime. Modern 64-bit runtimes will generate an ivar for accessor properties, so you don't even need to create the ivar. Properties are in fact methods:

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

对于每个属性,都有两种方法(除非属性声明为readonly,在这种情况下只有一种方法):gettersetter(不使用readonly ivar声明),前者返回与ivar相同的类型,后者与ivar同名;它返回void,其名称仅在变量名前加set.

因为它们是方法,所以可以对它们进行动态调用.使用NSSelectorFromString()和各种performSelector:方法,您可以制作一个具有多种可能性的非常动态的程序.

最后,属性广泛用于核心数据中,并具有Key-Value Coding个属性.Core Data是一个高级框架,用于在SQLite数据库中存储数据,同时提供清晰的Obj-C前端;KVC用于整个核心数据,是访问属性的动态方式.它用于编码/解码对象,例如从XIB读取时.

Objective-c相关问答推荐

iOS 编译错误:CDVCommandDelegateImpl没有可见的@interface 声明 Select 器执行:

如何处理 Xcode 警告没有以前的函数原型......?

更改 UIDatePicker 字体 colored颜色 ?

以原子方式写入文件与不写入文件之间的区别

来自 NSString 的 NSJSONSerialization

启动 Finder 窗口并 Select 特定文件

在 iOS 7 中检测后台应用刷新的用户设置

如何更改 UICollectionView 中的滚动方向?

从 UIScrollView 中删除所有子视图?

在 iPhone 应用程序中使用 RestKit 的最佳方式

xcode storyboard Container View - 如何访问视图控制器

如何在 iPhone 中将 NSData 转换为字节数组?

Xcode 在 iOS 8 中的 Main() 中引发异常,并带有所有异常断点

为什么 LLDB 不能打印 view.bounds?

如何像在 Spotify 的播放器中一样创建居中的 UICollectionView

@dynamic 在 Objective-C 中做了什么?

AppDelegate 的当前视图控制器?

UIImage上的圆角

ARC 下的 NSString 属性应该是强的还是复制的?

使用 [NSDate date] 获取当前日期和时间