10.消息动态决议

一、方法找不到的底层报错原理

1.在lookUpImpOrForward中第一行代码中默认的指针_objc_msgForward_impcache

2.全局搜索_objc_msgForward_impcache,在objc-msg-arm64.s文件中

3.进入__objc_msgForward,会调用__objc_forward_handler

4.全局搜索objc_forward_handler,在objc-runtime.mm中
image.png

二、方法动态决议

1.找不到会执行resolveMethod_locked函数
image.png
如果是类方法,先执行resolveClassMethod,然后判断(!lookUpImpOrNilTryCache(inst, sel, cls)),就是没找到类方法,在执行resolveInstanceMethod,为什么?因为类方法是在元类中查找,而根元类NSObject元类的父类是NSObject,所以会再来查找一次NSObject实例方法,也验证了isa的走位图

2.resolveMethod_locked函数会执行resolveInstanceMethod函数
image.png
3.重新查找lookUpImpOrNilTryCache函数
image.png
4.类方法会执行resolveClassMethod
image.png

三、消息转发流程引子

如果resolveInstanceMethod没实现,会走哪步呢?

先看下instrumentObjcMessageSends函数
image.png
然后全局搜索objcMsgLogEnabled,可以看到会写信息文件在/tmp/msgSends路径下
image.png

搜索路径/tmp/msgSends会看到有个msgSends-的文件
image.png
看到下面有很多方法。哈哈。。。下节见。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享