Objective-C是以C语言为基础,所以值得讨论两者的关系。下面是一些可以忽略的实现细节,或可以用来更好地理解系统工作方式的细节。没有涉及太多详细的内容,知识阐明关于Objective-C和C联系的4个事实。
1:实例变量存储在结构中
定义一个新类和它的实例变量时,这些实例变量实际上存放在一个结构中。这说明了可以如何处理对象,对象实际上是结构,结构中的成员是实例变量。所以继承的实例变量加上你在类中的变量就组成了一个结构。使用alloc分配新对象时,系统预留了足够的空间来存储这些结构。
结构中继承的成员(从根对象中获得的)之一是名为isa的保护成员,它确定对象所属的类。因为它是结构的一部分(因此,也是对象的一部分),所以由对象携带。这样。运行时系统只需通过查看isa成员,就可以确定对象的类(即使将其赋给通用的id对象变量)。
2:对象变量实际上是指针
我们假定定义一个Person类的对象变量,如
Person *person;
事实上是定义了一个名为person的指针变量。这个变量定义为指向Person类型的数据,即你的类名称。使用
person = [Person alloc];
来创建Person的新实例时,实在为Person对象的新实例分配存储内存(即存放结构的空间),然后使用结构的指针,并将指针变量person存储在其中。
将对象变量赋给另一个对象变量时,语句
person1 = person2;
只是简单地复制了指针。这两个变量最后都指向存储在内存中的同一结构。因此,改变person1引用的一个成员,将更改person2引用的同一个实例变量。
3:方法是函数,而消息表达式是函数调用
方法实际上是函数。调用方法时,是在调用与接收者类相关的函数。传递给函数的参数是接收者(self)和方法的参数。所以,无论是函数还是方法,关于传递参数给函数、返回值及自动和静态变量的规则是一样的。Objective-c编译器通过类名称和方法名称的组合为每个函数产生一个唯一的名称。
4:id类型是通用指针类型
因为通过指针(也就是内存地址)来引用对象,所以可以自由地将它们在id变量之间来回赋值。因此,返回id类型值得方法只是返回指向内存中某对象的指针。然后可以将该值赋给任何对象变量。因为无论在哪里,对象总是携带它的isa成员,所以,即使将它存储在id类型的通用对象变量中,也总是可以确定它的类。