一、方法找不到的底层报错原理
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中
二、方法动态决议
1.找不到会执行resolveMethod_locked函数
如果是类方法,先执行resolveClassMethod,然后判断(!lookUpImpOrNilTryCache(inst, sel, cls)),就是没找到类方法,在执行resolveInstanceMethod,为什么?因为类方法是在元类中查找,而根元类NSObject元类的父类是NSObject,所以会再来查找一次NSObject实例方法,也验证了isa的走位图
2.resolveMethod_locked函数会执行resolveInstanceMethod函数
3.重新查找lookUpImpOrNilTryCache函数
4.类方法会执行resolveClassMethod
三、消息转发流程引子
如果resolveInstanceMethod没实现,会走哪步呢?
先看下instrumentObjcMessageSends函数
然后全局搜索objcMsgLogEnabled,可以看到会写信息文件在/tmp/msgSends路径下
搜索路径/tmp/msgSends会看到有个msgSends-的文件
看到下面有很多方法。哈哈。。。下节见。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END