iOS 探讨之 "最后的挽留" - 消息转发

阐述
在被虐中一点一点前进着…这是最近的概况。有个问题一直没能静下心来研究,最近被它狠狠地往心口刺了几下,故狠下心来解析它 --- 消息转发(最后的挽留)。

探讨
从”汪洋大海”中寻得一张“最后的挽留”图,能大概的描述当时的场景。


当对象找不到方法时所进行的流程
1 动态方法解析
2 快速消息转发
3 标准消息转发

1 动态方法解析
向当前类发送 + resolveInstanceMethod:  检查是否动态向类添加方法来解决当前问题。
官方资料: 

通过官方资料可以看出,我们是能够在 + resolveInstanceMethod: 方法中进行一些操作来动态的往类中添加方法,保证功能运行。当然我们也可以不交给自己的类进行处理,那么我们就直接返回NO。

2 快速消息转发
若 Step 1 没有成功处理该问题,会触发- forwardingTargetForSelector: 方法(若实现),来检查是否有合适的其它对象可以处理该消息。
若找到合适的对象,则将该消息转发至合适的对象。

方法中的检查合适对象处理该消息片段是编码者手动构造的,有时也并不那么合理。(毕竟只是挽留)

3 标准消息转发(最后的晚餐)
若 Step 2 没有成功处理该问题,Runtime 则会触发 - methodSignatureForSelector: 方法来获取 aSelector 对应的方法签名。
若方法签名不为空,在触发 - forwardInvocation: 转发消息。
若方法签名为空,则触发 - doesNotRecognizeSelector: 方法,程序崩溃。

因此如果我们希望在“最后的晚餐”中挽回局面,我们就需要在 - methodSignatureForSelector: 和 - forwardInvocation: 做努力。

(上面截图的示例是Person类处理不了的事件,看看Dog是否能够帮忙,这也是实现多继承的一个切入口)

总之上方的三处我们是可以做出一些挽留的,但是一个良好的编码习惯还是需要的。(当然我们也可以在里面做一点点坏事)

资料

猜你喜欢

转载自blog.csdn.net/yanglei3kyou/article/details/79772327