本篇文章采用的源码是objc4-781版本
class_ro_t
class_ro_t
存储了当前类在编译期就已经确定的属性
、方法
以及遵循的协议
,里面是没有分类的方法
的。那些运行时添加的方法将会存储在运行时
生成的class_rw_t
中。
ro
即表示read only
,是无法进行修改的。
class_rw_t
ObjC
类中的属性
、方法
还有遵循的协议
等信息都保存在 class_rw_t
中
class_rw_t生成时机
class_rw_t
生成在运行时,在编译期间,class_ro_t
结构体就已经确定,objc_class
中的bits
的data部分存放着该结构体的地址。在runtime
运行之后,具体说来是在运行runtime
的realizeClass
方法时,会生成class_rw_t
结构体,该结构体包含了class_ro_t
,并且更新data部分,换成class_rw_t
结构体的地址。
类的realizeClass
运行之前:
类的realizeClass
运行之后:
细看两个结构体的成员变量会发现很多相同的地方,他们都存放着当前类的属性、实例变量、方法、协议等等。区别在于:class_ro_t
存放的是编译期间就确定的;而class_rw_t
是在runtime时才确定,它会先将class_ro_t
的内容拷贝过去,然后再将当前类的分类的这些属性、方法等拷贝到其中。所以可以说class_rw_t
是class_ro_t
的超集,当然实际访问类的方法、属性等也都是访问的class_rw_t
中的内容
网友评论