猜测是对的。
msgSend: 原理
一、 发送消息是会查询当前 Class 的cache 缓存中是否有method。
如果没有就到 methodList 中是否有与 sel 相对应的方法实现,
如果有直接执行。如果没有, 执行动态解析。
二、动态解析中不管是否有添加新的IMP给SEL。都会再次执行 一 步骤。
如果动态解析中添加了方法实现,那么在重复执行一步骤的时候就结束了。
如果没有添加,就会来到消息转发。
三消息转发: forwardingTargetForSelector: 走消息转发流程。
所以不论返回的值是YES或者NO。只要methodList和动态解析都没有找到函数实现,就会来到forwardingTargetForSelector。
至于返回值是YES或NO的区别,真没区别,看官方的源码可以看到这个返回值没有用来做什么判断。
这个时候如果我们没有重写forwardingTargetForSelector ,添加转发对象及IMP。那么就会来到methodSignatureForSelector。这个是用来返回方法签名的,其实就是要求返回Types编码。
如果这个方法我们还是没有重写。那么就会报经典错误“unrecognized selector sent to instance ”
@王英良不止是名字
iOS Runtime详解Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍...