接上篇OC底层原理(二)
平时自己都有学习一些底层原理,但是太过分散,也没有写过笔记,这次正好通过mj课程查漏补缺,也记录下来。
本节内容也有一道面试题。
问:OC的类信息存放在哪里?
之前我们已经研究过了instance对象、class对象、meta-class对象,及内部isa指针。而且我们说class对象和meta-class对象同样都是objc_class结构体类型,接下来我们就看下这个结构体内部结构。
在objc源码中,objc/objc-runtime-new.h中objc_class结构体的定义如下:
我们再看下class_rw_t 内部:
class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的。
以method_array_t为例,method_array_t本身就是一个数组,数组里面存放的是数组method_list_t,method_list_t里面最终存放的是method_t。
class_ro_t是只读的,存放成员变量信息,我们在看class_ro_t内部:
class_ro_t中的方法列表等,来源于初始化class的时候方法列表,通过runtime机制,会合并到class_rw_t(可读可写)中,这里具体以后在runtime内容中讲。
整体关系大概和下图这样:
验证的问题我就不做了,大家可以看这篇写的比较详细https://www.jianshu.com/p/74db5638f34f
面试题解答
问:OC的类信息存放在哪里?
答:成员变量的具体值存放在instance对象。
对象方法,协议,属性,成员变量信息存放在class对象。
类方法信息存放在meta-class对象