动态决议、快速转发、慢速转发
2022-12-07 本文已影响0人
改变1
在项目运行过程中,如果找不到方法,runtime是有三次机会给我们处理的。写了一个闪退,获取了一个代码调用信息如下:

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

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