实例对象、类对象与元类对象的关系
- 实例对象
- isa
- 其他成员变量
- 通过isa找到类对象
- 类对象
- isa
- superclass
- 属性、对象方法、协议、成员变量
- 通过isa找到元类对象
- 元类对象
- isa
- superclass
- 类方法
class对象的superclass指针
- Student继承自Person
- Student的实例对象(isa)-> Student的类对象(superclass)-> Person的类对象,这样Student就可以调用Person的类方法了。
meta-class对象的superclass指针
- 也是差不多的通过isa和superclass的互相配合找到元类对象,这样就可以调用类方法了。
我认为OC的继承的实现原理就是这样的。
总结 isa、superclass
- instance的isa指向class
- class的isa指向meta-class
- meta-class的isa指向基类的meta-class
- class的superclass指向父类的class
- 如果没有父类,superclass指针为nil
- meta-class的superclass指向父类的meta-class
- 基类的meta-class的superclass指向基类的class
- instance调用对象方法的轨迹
- isa找到class,方法不存在,就通过superclass找父类
- class调用类方法的轨迹
- isa找meta-class,方法不存在,就通过superclass找父类
- isa找meta-class,方法不存在,就通过superclass找父类
class的结构
- isa指针进行一次位运算 & 才能得到真正的地址,并不是 isa 指针直接使用的
窥探struct objc_class的结构
-
bits也是&一个位运算找到方法列表等信息
-
源码bits
-
data是bits&FAST_DATA_MASK
-
找到 class_rw_t 结构体
-
里面有methods、properties和protocols
-
找到class_ro_t 里面是baseProtocol和baseproperties