开始之前先问?
提问?
对象的isa指针指向哪里?
通过查看源码来学习:
源码下载地址
https://opensource.apple.com/tarballs/objc4/
![](https://img.haomeiwen.com/i2248534/9ee2ac8671261bc4.png)
-
instance的isa指向class
当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用 -
class的isa指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
![](https://img.haomeiwen.com/i2248534/1bd750ea61d56c07.png)
- 当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的class,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用
![](https://img.haomeiwen.com/i2248534/5a5172d23394a923.png)
- 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到Person的meta-class,最后找到类方法的实现进行调用
struct objc_class的结构
![](https://img.haomeiwen.com/i2248534/e10c6b054a8b07dc.png)
总结:
![](https://img.haomeiwen.com/i2248534/7ced338b57449ee6.png)
-
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指针指向哪里?
instance对象的isa指向class对象
class对象的isa指向meta-class对象
meta-class对象的isa指向基类的meta-class对象
网友评论