Objective-C与C语言联系的4个事实

事实1:实例变量存储在结构中

定义一个新类和它的实例变量时,这些实例变量实际上存放在一个结构中。这说明了可以如何处理对象,对象实际上是结构,结构中的成员是实例变量。所以继承的实例变量加上你在类中添加的变量就组成了一个结构。使用alloc分配新对象时,系统预留了足够的空间来存储这些结构。

结构中继承的成员(从根对象中获得的)之一是名为isa的保护成员,它确定对象所属的类,因为它是结构的一部分(因此,也是对象的一部分),所以由对象携带。这样,运行时系统只需要通过查看isa成员,就可以确定对象的类(即使将其赋给通用的id对象变量)。

事实2:对象变量实际上是指针

定义Fraction之类的对象变量,如

Fraction *myFract;

事实上是定义了一个名为myFract的指针变量。这个变量定义为指向Fraction类型的数据,即你的类名称。使用

myFract = [Fraction alloc];

来创建Fraction的新实例时,是在为Fraction对象的新实例分配存储内存,即存放结构的空间,然后使用结构的指针,并将指针变量myFract存储在其中。

事实3:方法是函数,而消息表达式是函数调用

方法实际上是函数。调用方法时,是在调用与接收者类相关的函数。传递给函数的参数是接收者(self)和方法的参数。所以,无论是函数还是方法,关于传递参数给函数、返回值及自动和静态变量的规则都是一样的。Objective-C编译器通过类名称和方法名称的组合为每个函数产生一个唯一名称。

事实4:id类型是通用指针类型

因为通过指针来引用对象,所以可以自由地将它们在id变量之间来回赋值。因此,返回id类型值的方法只是返回指向内存中某对象的指针。然后可以将该值赋给任何对象变量。因为无论在哪里,对象总是携带着它的isa成员,所以,即使将它存储在id类型的通用变量中,也总是可以确定它的类。

相关推荐