分为两大阶段 (参考 高质量iOS 与 OSX 的52 个有效方法)
1.动态解析(dynamic method resolution)
先征询接受者,所属的类,看其是否能动态添加方法, 处理当前未知的选择子
- 完整的消息转发机制
第一阶段执行完, 就无法以动态新增方法的手段来相应包含选择子的消息了. 此时, 运行期系统会请求接收者以其手段来来处理与选择子相关的方法调用; 这又分为两小步
2.1 首先接受者看看其他对象能否处理这条消息, 若有,运行期系统会把消息转发给那个对象, 消息转发结束.
2.2若没有''备援的接受者(replacement receiver)", 则启动完整的消息转发机制, 运行期系统会把与消息相关的全部细节(选择子, 目标, 参数)封装到NSInvocation 对象中, 再给接受者最后一次机会, 令其设法解决当前还未处理的消息. 在触发NSInvocation对象时, 消息派发系统(message-dispatch system)会亲自出马, 把消息指派给目标对象.
完整流程图

总结:
- 若对象无法响应某个选择子, 则进入消息转发流程
- 通过运行期的动态方法解析功能, 我们可以在需要用到某个方法时再将其加入到类中;
- 对象可以把无法解读的某些选择子转交给其他对象来处理.
4.经过上述两步之后, 如果还是没法处理选择子, 则就启动完整的消息转发机制;
网友评论