接上文找不到方法,进入动态方法解析则会调用该方法
从注释中可以看的,要查找添加到cls中的方法,这个指针指向的对象,可以是个元类对象也可以是一个类对象,其具体逻辑如下
通过resolved获取方法的相关信息,再进行对imp进行判断,如果imp存在则输出动态方法解析出的方法选择器的名字和对应的imp实现,如果没有方法解析器添加进去,则输出没有找到方法的实现,输出方法选择器,但没有对应的方法实现,如果是类方法则调用的是resolveClassMethod
其流程图大致如下
如果动态方法解析和消息转发都没有,则会报出这个经典的错误
学习了Runtime的动态方法解析后,可以通过Runtime在运行时动态的添加方法,具体实现如下图所示,通过resolveInstanceMethod,可以动态设置方法的实现,测试运行,Person类的test方法的实现成功改为了newTest。
如果动态方法解析也找不到,那么进入消息转发,添加一个新的类
添加forwardingTargetForSelector方法,设置要转发的对象,此时main调用的中调用的方法,仍然是p的test
结果如下,打印的方法是属于新增的Baby类的
如果forwardingTargetForSelector的返回值为空,则调用methodSignaltureForSelestor方法
如果methodSignaltureForSelestor方法的返回签名为空,则报错
如果methodSignaltureForSelestor方法的返回值不为空,则调用最后一步,调用forwardInvocation方法,完成消息转发
基本流程如下图所示
以上就是整套消息发送机制的基本原理