objc_object定义
在OC中每个对象都是一个结构体,结构体中都包含一个isa_t类型的成员变量,位于成员变量的第一位。

objc_class定义
objc_class继承于objc_object,也就是说一个ObjC类本身同时也是一个对象,为了处理类和对象的关系,runtime库创建了一种叫做元类(Meta Class)的东西,类对象所属类型就叫做元类。
我们常用的Class 其实是一个指向 objc_class 结构体的指针。

上图中所示结构体中,superclass是一个指向父类结构体的指针,cache用于对通过方法名字查找方法实现指针IMP的一个优化。
这个结构体中最重要的是class_data_bits_t结构体,它包括太多信息。这里我只说下最为重要的部分:class_rw_t;


再说class_rw_t结构体之前先看看class_rw_t结构体中的常量class_ro_t

两个结构体都包含了关于类的属性,方法,成员变量等信息。
class_ro_t是在编译期决定的,它的结构体是不可变的,在编译期会给 instanceStart 和 instanceSize 赋值,确定好编译时每个类的所占内存区域起始偏移量和大小。
而class_rw_t提供了运行时对类拓展的能力,在运行时,在类第一次初始化时通过调用 realizeClass函数完成了rw的初始化,在methodizeClass(cls);函数中完成的赋值。如果在运行时动态修改,也就是对rw的操作,ro只是在编译期就已经决定的原数据。
网友评论