美文网首页
iOS isa与superclass详解

iOS isa与superclass详解

作者: ios小蜗牛 | 来源:发表于2020-07-03 17:43 被阅读0次

参考

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指针,指向基类的类对象。

实现图

image.png

对象方法的调用轨迹

调用对象方法时,通过实例对象的isa找到类对象,在类对象中找对象方法,如果方法不存在,就通过superclass找类对象的父类,最后找到对象方法的实现进行调用。

类方法的调用轨迹

调用类方法时,通过类对象的isa找到元类对象,在元类对象中找类方法,如果方法不存在,就通过superclass找元类对象的父类,最后找到类方法的实现进行调用。

获取isa地址

打印实例对象的isa的地址时,会发现打印出的地址跟它的类对象的地址有一些区别。
因为从64bit开始,都要进行一次位运算(&),才能得到真实地址。

利用LLDB执行以下代码就可以得到实际的isa地址。
arm64架构:0x0000000ffffffff8
x86架构:0x00007ffffffffff8
p/x 0x8a1d8981898814c9 & 0x0000000ffffffff8 
image.png

补充

1.因为基类的元类对象的superclass指针的特殊,所以调用类方法,最后可能会执行同名的对象方法。
2.本文如有侵犯隐私或其他请联系我,我将在第一时间整改或删除。

相关文章

网友评论

      本文标题:iOS isa与superclass详解

      本文链接:https://www.haomeiwen.com/subject/veqsqktx.html