对象、类、元类、父类 的关系图
总结:
- 对象的指针不指向父类
- 元类的指针指向根元类
- 根元类的指针自己
- 根元类的父类指向根类(NSObject)
- 根元类是唯一的(NSObject),类对象在内存中也是唯一的,地址唯一
- 实例对象没有父类
类结构分析
struct objc_object { isa_t isa; //指针 }
struct objc_class ( // 继承 objc_object 一个指针 isa class superclass; cache_t cache; class_data_bits bits; class_rw_t *data() const{ return bits.data(); }; }
objc_class 继承 objc_object,故:每个类对象都有 isa 指针,父类,cache,bits等
class_data_bits bits
我们可以通过内存偏移找到起始地址,isa 指针 8字节,superclass 8字节,cache_t 占 16字节,所以 class_data_bits在结构体中的内存便宜是32字节
class_data_bits 内部包含 class_rw_t.class_rw_t内部存放存放类的属性列表 方法列表 协议列表
cache_t
cache_t中存放的是方法,当调用方法时先在cache_t中查询是否有方法,如果没有再去 method_list 中查找方法,找到之后 在存储到cache_t中。