在Object-C的类型结构中,有几个比较重要的概念Object(实例),Class(类),Metaclass(元类),Rootclass(根类),Rootclass‘s metaclass(根元类)。有面向对象编程语言背景的同学可以很容易理解类和实例。在Object-C中,Object本质上是一个struct,在这个struct中会保存一个名为isa的指针,该指针会指向该Object的类。如下:
Object的类中保存了该Object实现的所有方法(即实例方法),另外还有类中还保存了父类的指针,这样Object的方法调用过程可以描述如下:
[list]
[*]1. 会根据isa找到类,
[*]2. 从类中寻找方法,
[*]3. 找到的话,直接执行。
[*]4. 没找到的话,继续沿着父类的指针往上找,直到找到为止。
[*]5. 最后都没找到,则报错。
[/list]
在Object-C中,类同样是一个Object,类实例同样有自己的isa,这就是元类。元类中保存了所有的类方法和父元类的指针。现在我们知道,对象是类的实例,类是元类的实例,那么元类呢? 元类是根元类的实例,根元类呢? 根元类是自己的实例,循环到此收尾。这就是整个Object-C语言的寻类过程。
那么,继承关系呢?Object-C中类的继承和元类的继承是并行的,如果类之间继承了,那么他们的元类也就继承了,直到根元类,根元类的父类是根类。这就是整个Object-C的对象模型。
[img]http://dl2.iteye.com/upload/attachment/0089/4172/cc9e0bf6-3bc8-3277-a155-905230bf6fcc.png[/img]
typedef struct objc_object {
Class isa;
} *id;
Object的类中保存了该Object实现的所有方法(即实例方法),另外还有类中还保存了父类的指针,这样Object的方法调用过程可以描述如下:
[list]
[*]1. 会根据isa找到类,
[*]2. 从类中寻找方法,
[*]3. 找到的话,直接执行。
[*]4. 没找到的话,继续沿着父类的指针往上找,直到找到为止。
[*]5. 最后都没找到,则报错。
[/list]
在Object-C中,类同样是一个Object,类实例同样有自己的isa,这就是元类。元类中保存了所有的类方法和父元类的指针。现在我们知道,对象是类的实例,类是元类的实例,那么元类呢? 元类是根元类的实例,根元类呢? 根元类是自己的实例,循环到此收尾。这就是整个Object-C语言的寻类过程。
那么,继承关系呢?Object-C中类的继承和元类的继承是并行的,如果类之间继承了,那么他们的元类也就继承了,直到根元类,根元类的父类是根类。这就是整个Object-C的对象模型。
[img]http://dl2.iteye.com/upload/attachment/0089/4172/cc9e0bf6-3bc8-3277-a155-905230bf6fcc.png[/img]