iOS superclass 和 isa 指针总结
2022年5月15日
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
指针找父类,如果父类方法不存在,就通过 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 |