美文网首页
动态决议、快速转发、慢速转发

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

作者: 改变1 | 来源:发表于2022-12-07 12:30 被阅读0次

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


    image.png

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


    image.png
    为什么这么设计?既然都能用resolveInstanceMethod处理,还要脱裤子放屁?因为效率问题,如果没有类方法的提供,当找不到此实现方法时,系统会一直向父类查找,直到查到顶层NSObject,调用链会很长。
    有一个需要注意的点是动态决议可以能会被调用两次,原因是当动态决议方法和快速转发都没有处理问题的时候,动态决议会调用两次。原因是慢速转发执行时,会调用lookUpImpOrForward方法,而lookUpImpOrForward方法执行时,就会调用resolveInstanceMethod一次,所以会有两次调用

    相关文章

      网友评论

          本文标题:动态决议、快速转发、慢速转发

          本文链接:https://www.haomeiwen.com/subject/ygenfdtx.html