OC底层原理(三):Class本质

接上篇OC底层原理(二)
平时自己都有学习一些底层原理,但是太过分散,也没有写过笔记,这次正好通过mj课程查漏补缺,也记录下来。

本节内容也有一道面试题。
问:OC的类信息存放在哪里?

之前我们已经研究过了instance对象、class对象、meta-class对象,及内部isa指针。而且我们说class对象和meta-class对象同样都是objc_class结构体类型,接下来我们就看下这个结构体内部结构。
在objc源码中,objc/objc-runtime-new.h中objc_class结构体的定义如下:


image.png

我们再看下class_rw_t 内部:


image.png

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内部:


image.png

class_ro_t中的方法列表等,来源于初始化class的时候方法列表,通过runtime机制,会合并到class_rw_t(可读可写)中,这里具体以后在runtime内容中讲。

整体关系大概和下图这样:


image.png

验证的问题我就不做了,大家可以看这篇写的比较详细https://www.jianshu.com/p/74db5638f34f

面试题解答

问:OC的类信息存放在哪里?
答:成员变量的具体值存放在instance对象。
对象方法,协议,属性,成员变量信息存放在class对象。
类方法信息存放在meta-class对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。