从上一篇文章中,我们可以知道消息的发送最终被转换为OBJC_MSGSEND函数。IMP将在缓存和方法列表中找到,直到找到父类的方法为零,并且步行到OBJC源代码的方法如下:
从源代码中,我们可以找到forwoar_imp的实现。最后,查看以下代码:
在这里,我们将看到一个常见的崩溃信息未识别的选择器;当将IMP分配给forward_imp时,输入方法:该方法的中间和动态分辨率;
1.2.1实例方法的动态分辨率是从中。当CLS不是元类时,您可以看到系统以找到系统以找到resolveinstancemethod方法;
当有示例时,有示例,没有实现,并意识到以下动态分辨率,您将调用Method1方法。代码如下::
1.2.2类方法的动态分辨率在存在类别时,有类方法,没有实现,并且实现以下动态分辨率,将调用Method2方法。代码如下:
未实施以下代码:
呼叫之所以称呼,是因为class_getMethodimplementation(self.class,@selector(Method3)),未找到方法,并且触发方法的动态分辨率是实例方法的动态分辨率将由当前类触发。
以下将更改为元级,无法实施:
循环呼叫,因为触发动态分辨率的方法,并传递了元类,并且在该方法中,它将确定它是元级选择的动态分辨率,是呼叫是动态分辨率还是动态分辨率实例方法的分辨率。
在该方法中,当IMP有价值时,在输入方法中,您最终可以查看是否将日志打印到中间,但仅在函数中分配一个值,定义类调用方法,该方法确实可以未实施,如下:
转到TMP文件夹,然后查看日志如下:您可以看到,在动态分辨率之后,该方法也会在崩溃之前调用。这两种方法是消息的重新发布。
消息的重新发布是在当前类中找不到此方法的IMP时,您可以将消息转发到其他类别。
这是新闻的快速转发,可以实施如下:
如果是类方法的方法的消息,则转发是类方法。
这是消息的缓慢转发。当未实现该方法的方法时,它将出现消息的缓慢转发。代码如下:
如果使用它,它不会在没有任何远期交换中任何处理的情况下崩溃。类方法的快速转发是和谐的
可用于收集未实现的方法。
当崩溃时,我们可以通过打印信息两次调用我们,以查看动态分辨率方法。第一次是objc_msgsend.call to LookupImporforward,如下:
原始:https://juejin.cn/post/7096064821560344589