当我初始接触到OC的时候,只不过觉得OC中的对象不过是一个结构体,里面存放着结构体变量和相关的函数指针。这的确挺符合面向对象设计思想,但是随着加深对Runtime的理解,便发现不是那么简单。
事实上OC中的对象比我想象中的更简单。因为它里面仅仅只有一个isa指针。证据如下:
展现在我们面前的确实很我想象的不一样,没有结构体变量和函数指针。这个isa指针实际上是指向这个对象所属的类,而这个类叫做类对象。比如说在 id obj = [NSObject new];中,obj是实例对象,那么NSObject就是obj的类对象。当我们向一个对象发送一个消息时,会找到这个对象所属的类,然后把消息交给这个类对象处理。那我们接下来看看类对象的定义:
留意到图片中的最后一行,可以得知类对象也是一个对象。那么向类对象发送一个消息时,它的isa指针会指向什么?比如说:[NSArray arrayWithObjects:XXX];向NSArray这个类对象发送消息时,沿着isa指针找到的是NSArray的元类。那元类也是一个类,它的isa指针又是指向什么?如果我们此时再引入一种新的类,那么这种新的类的isa指针又要指向另一种新的类,这会导致无限循环下去。因此,需要引入根元类的这个概念,使得所有元类的isa指针都指向它,而根元类的isa指针就指向自身。这样就形成了一个消息闭环。说再来也比不上来一张图实际:
图中还有superClass指针的关系,可以看到元类的superClass指针不像isa指针那样直接指向根元类,而根元类的superClass指针则是指向NSObject。但是这幅图只是针对NSObject的继承体系。
objc_class对象中还有很多变量,本文只要搞清楚类和对象的关系,其他的以后再解释。