近期很多朋友问起这个方法调用的流程,小编在这里整理了一下:
小编致力于用精简的语言说明不精简的问题
一、对象如何找到对象方法来调用:
- 对象方法存放在类中,类方法存放在元类(meta class)中。
- 类调用的方法,在runtime底层,会把类转化为类对象再调用方法。
- 每一个类都有一个方法列表(MethodList)(已实现的方法)。
1.根据isa指针找到所属类
2.根据方法编号在方法列表中找到类中的方法名
3.根据方法名到方法区找到方法的实现
二、类如何找到类方法来调用:
- 元类保存了类方法列表
- 元类(meteClass)是类,也是对象
1.根据所属类的isa指针找到元类
2.根据方法编号在类方法列表中找到类中的方法名
3.根据方法名到方法区找到方法的实现
4.如果没有,向父元类查找实现
三、方法调用总流程:
1.在对象自己缓存的方法列表中找方法编号,根据编号执行其实现
2.没有,执行 ‘一’
3.没有找到方法编号,说明这个类没有实现该方法,根据类的isa指针找到父类执行‘一’
4.一直到根类也没有方法编号,转向‘调用未实现方法的拦截’的方法可以在方法里面做处理
5.没做处理,报错崩溃