参考
https://ke.qq.com/course/314526
isa
1.实例对象,类对象,元类对象的内部都有一个isa指针。
2.实例对象的isa指针,指向它的类对象。
3.类对象的isa指针,指向它的元类对象,当调用类方法时,通过类对象的isa找到。
4.元类对象,最后找到类方法的实现进行调用。
5.所有元类对象的isa指针,都指向基类的元类对象。
superclass
1.类对象,元类对象的内部都有一个superclass指针。
2.类对象的superclass指针,指向它的父类对象。
3.元类对象的superclass指针,指向父类的元类对象。
4.基类的类对象的superclass指针,指向nil。
5.基类的元类对象的superclass指针,指向基类的类对象。
实现图
![](https://img.haomeiwen.com/i2900749/1f0dcf5ec54342d0.png)
对象方法的调用轨迹
调用对象方法时,通过实例对象的isa找到类对象,在类对象中找对象方法,如果方法不存在,就通过superclass找类对象的父类,最后找到对象方法的实现进行调用。
类方法的调用轨迹
调用类方法时,通过类对象的isa找到元类对象,在元类对象中找类方法,如果方法不存在,就通过superclass找元类对象的父类,最后找到类方法的实现进行调用。
获取isa地址
打印实例对象的isa的地址时,会发现打印出的地址跟它的类对象的地址有一些区别。
因为从64bit开始,都要进行一次位运算(&),才能得到真实地址。
利用LLDB执行以下代码就可以得到实际的isa地址。
arm64架构:0x0000000ffffffff8
x86架构:0x00007ffffffffff8
p/x 0x8a1d8981898814c9 & 0x0000000ffffffff8
![](https://img.haomeiwen.com/i2900749/414468f3e558f704.png)
补充
1.因为基类的元类对象的superclass指针的特殊,所以调用类方法,最后可能会执行同名的对象方法。
2.本文如有侵犯隐私或其他请联系我,我将在第一时间整改或删除。
网友评论