13.8 工作原理
如果没有先尝试将一些事物联系在一起就结束本章,那么我们就没有尽到责任。因为Objective-C语言以C语言为基础,所以值得讨论前者和后者的关系。下面是一些可以忽略的实现细节,或可以用来更好地理解系统工作方式的细节,就像学习指针实际上是内存地址可以帮助你更好地理解指针一样。我们没有涉及到太多详细内容,只是阐明关于Objective-C语言和C语言联系的4个事实。
事实#1:实例变量存储在结构中
定义一个新类和它的实例变量时,这些实例变量实际上存放在一个结构中。这说明了可以如何处理对象;对象实际上是结构,结构中的成员是实例变量。所以继承的实例变量加上你在类中添加的变量就组成了一个结构。使用alloc分配新对象时,系统预留了足够的空间来存储这些结构。
结构中继承的成员(从根对象中获得的)之一是名为isa的保护成员,它确定对象所属的类。因为它是结构的一部分(因此也是对象的一部分),所以由对象携带。这样,运行时系统只需通过查看isa成员,就可以确定对象的类(即使将其赋给通用的id对象变量)。
通过将成员定义为@public,可以获得对象结构成员的直接存储权限(详见第10章“变量和数据类型”)。举个例子,如果对Fraction类中的numerator和denominator成员进行了这项操作,那么可以在程序中编写如下表达式
myFract->numerator
来直接访问Fraction对象myFract的numerator成员。但是,我们强烈建议不要这么做!在第10章中提到过,它违反了数据封装的特性。