类结构分析图
类结构分析图这里直接上图会比较清晰一些,源码的追踪过程这里就不赘述了。主要追踪关键方法objc_class : objc_object
。
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
class_rw_t *data() const {
return bits.data();
}
void setData(class_rw_t *newData) {
bits.setData(newData);
}
void setInfo(uint32_t set) {
ASSERT(isFuture() || isRealized());
data()->setFlags(set);
}
void clearInfo(uint32_t clear) {
ASSERT(isFuture() || isRealized());
data()->clearFlags(clear);
}
// set and clear must not overlap
void changeInfo(uint32_t set, uint32_t clear) {
ASSERT(isFuture() || isRealized());
ASSERT((set & clear) == 0);
data()->changeFlags(set, clear);
}
// 此处省略一万行
}
isa
objc_class
的第一个成员isa
,源码里虽然注释,但也在提醒我们objc_class
继承自objc_object
,自带了isa
特性。isa
的流程也已经在上篇文章OC底层-ISA的前生今世分析过了,感兴趣的可以直接去看。占位8
字节。
Class superclass
Class superclass
表示类
的父类,也是8
字节。
cache_t cache
cache_t cache
表示方法缓存,用散列表
来缓存调用过的方法,可以提高访问方法的速度。cache_t cache
是方法调用又一巧妙设计,这里只关心它在类中占据的内存大小16
字节。
class_data_bits_t bits
class_data_bits_t bits
关键先生存储类
的大部分信息,可以类比isa
中uintptr bits
。
class_rw_t
class_rw_t
中存储这属性列表property_array_t properties
、实例方法列表method_array_t methods
、协议列表protocol_array_t protocols
等信息。class_rw_t
中这些存储是程序在runtime(运行时)
拷贝添加的,它会先将class_ro_t
的内容拷贝过去,然后再将当前类的分类的这些属性
、方法
、协议
等拷贝到其中。
class_ro_t
class_ro_t
中存储这成员变量列表ivar_list_t ivars
、类方法列表method_list_t baseMethodList
、协议列表protocol_list_t baseProtocols
等信息。class_ro_t
中ro
的意思是read only
,所以class_ro_t
存储了当前类在编译期
就已经确定的成员变量
、类方法
以及遵循的协议
网友评论