属性和实例变量间的关系
-
“属性”(property)是 Objective-C 的一项特性,用于封装对象中的数据。 Objective-C 对象通常会把所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。其中,“获取方法”(getter)用于读取变量值,而“设置方法“(setter)用于写入变量值。开发者可以利用“属性”这一特性令编译器自动编写与属性相关的存取方法,此特性引入了一种新的“点语法”,使开发者可以更为容易地依照类对象来访问存放于其中的数据。
-
一个问题:如果代码中实例变量使用了编译期计算出的偏移量,那么修改类定义之后必须重新编译,否则就会出错。例如,某个代码库中的代码使用了一份旧的类定义,如果和其链接的代码使用了新的类定义,那么运行时就会出现不兼容现象。
Objective-C 的做法是:把实例变量当作一种存储偏移量所用的“特殊变量”,交由“类对象”(class object)保管。偏移量会在运行期查找,如果类的定义变了,那么存储的偏移量也变了,这样的话,无论何时访问实例变量,总能使用正确的偏移量。 甚至可以在运行期向类中新增实例变量,这就是“稳固的”(notfragile)“应用程序二进制接口”(Application Binary Interface, ABI)。ABI定义了许多内容,其中一项就是生成代码时应遵循的规范。有了这种“稳固的”(nonfragile)的ABI,我们就可以在类扩展(E