动态决议、快速转发、慢速转发

在项目运行过程中,如果找不到方法,runtime是有三次机会给我们处理的。写了一个闪退,获取了一个代码调用信息如下:


image.png

首先如果我们实现了resolveInstanceMethod方法首先会执行,此动态决议系统也供了一个类方法无法找到时发生闪退的一个实现,为resolveClassMethod。但是殊途同归,如果我们有实现resolveClassMethod当类方法无法找到时,系统发现我们实现了此动态决议方法,会直接调用。如果没有实现它最后还是会调用resolveInstanceMethod方法。根据苹果的源码可以看下


image.png

为什么这么设计?既然都能用resolveInstanceMethod处理,还要脱裤子放屁?因为效率问题,如果没有类方法的提供,当找不到此实现方法时,系统会一直向父类查找,直到查到顶层NSObject,调用链会很长。
有一个需要注意的点是动态决议可以能会被调用两次,原因是当动态决议方法和快速转发都没有处理问题的时候,动态决议会调用两次。原因是慢速转发执行时,会调用lookUpImpOrForward方法,而lookUpImpOrForward方法执行时,就会调用resolveInstanceMethod一次,所以会有两次调用
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容