用OC等面向对象语言编程时,“对象”就是“基本构造单元”,开发者可以通过对象来存储并传递数据。对象之间传递数据并执行任务的过程就叫做“消息传递”。其实“对象”就可以理解为每个文件,“消息传递”就是文件之间的传递。
第6条:理解“属性”这一概念
“属性”是OC的一项特性,用于封装对象中的数据。OC对象通常会把其需要的数据保存为各种实例变量。实例变量通过“存取方法”来访问。其中,“获取方法”用于读取变量值,而“设置方法”用于写入变量值。
1.编译器是怎么存储实例变量的:
通常我们在写一个类时,其中的各种设置方法还需要我们自己去书写,例如:setter、getter方法,用于基本的赋值和获取。并且因为编译器存储实例对象时将每个实例变量替换为“偏移量”来存储的,这个偏移量是“硬编码”表示该变量距离存放对象的内存区域的起始地址有多远。这样便面看上去没有什么问题,但是若你在编译期完成之后再往实例变量的最前方加一个实例变量,那么它后边的所有实例变量的位置都会向后偏移,就会导致你到时候获取到的是一个错误的数据,所以我们每次在修改类定义之后必须重新编译,否则就会出错。
2.不兼容现象:
如果我们遇到不兼容现象,即改变了其原有的类定义程序所引发的现象,在OC中有两种解决方法,一种是:OC把实例变量当作一种存储偏移量所用的“特殊变量”,交由“类对象”保管。因为偏移量会在运行期查找,所以累的定义若变了,其存储的偏移量也就变了,它就可以找到正确的变量位置,这就是“应用程序二进制接口”(ABI)。另一种就是:尽量不要直接访问实例变量,而应该通过存取方法来做,就是我之前说过的setter、getter方法。
3.@property关键字
setter方法一般命名为set+实例变量的名称,用于设置实例变量的值,getter方法一般命名为实例变量的名称,用于获取实例变量的值。有了这两种方法用户就可以通过这两种方法来实现对实例变量的赋值和获取,但是如果定义的实例变量太多了,每个实例变量都得自己完成这些方法的话未免也太麻烦了,所以这里OC就出现了“@property”关键字,用它创建的变量就是一个属性,它会自行合成一个实例变量相应的setter、getter方法。这时候你如果想再访问其内容的话,你可以使用“点语法”这其实和C语言中的结构体很类似。这个过程由编译器在编译器执行,所以编译器里看不到这些“合成方法”的源代码。@property就像这样使用:
使用@property关键字它会自动生成一个带有下划线的名字,这就是你这个实例变量的名字,当然你也可以用“@synthesize”关键字来自己为你创建的实例变量起一个名字。就像这样: