iOS superclass 和 isa 指针总结
2022年5月15日

instance的isa指针指向class;class的isa指向meta-class;meta-class的isa指针指向基类的meta-class;class的superclass指针指向父类的class;
如果没有父类,superclass指针为nilmeta-class的superclass指针指向父类的meta-class;- 基类的
meta-class的superclass指针指向基类的class;
instance 调用对象方法的轨迹
通过 isa 指针找到 class,方法不存在,就通过 superclass 指针找父类,如果父类方法不存在,就通过 superclass 指针找根类(也就是 NSObject),如果根类方法不存在,就会报 unrecognized selector 错误;
class 调用类方法的轨迹
通过 isa 指针找 meta-class,方法不存在,就通过 superclass 找父类的 meta-class,如果父类的 meta-class 方法不存在,就通过 superclass 指针找根类(也就是 NSObject)的 meta-class,如果根类的 meta-class 方法不存在,就通过 superclass 找根类的 class,如果根类方法不存在,就会报 unrecognized selector 错误;


1 | p/x (long)person->isa |
从 64bit 开始,isa 需要进行一次位运算,才能计算出真实地址;说明,实例对象 isa 指针里面存放的地址值应该是这个类对象的。
1 | p/x (long)person->isa |