OC的消息转发 机制

102 阅读1分钟

首先我们看下objc_msgSend 是具体如何发送消息的

  1. 首先根据对象的指针去获取对应的类
  2. 在类的cache中查找方法, 如果找不到,在到methodLists查找
  3. 如果没有在类中查找到方法,再到父类去查找 重复这操作继续查找
  4. 如果找到message方法,在根据receirver中的self 指针找当前对像,调用当前对象的imp, 传递参数,调用实现方法。
  5. 最后如果都没找到改方法,这时候进入消息转发机制大致如下:

WeChateaa9fa49ef2673469e2796f5c482b680.png

解释一下

  1. 动态解析: + (BOOL)resolveInstanceMethod:(SEL)sel;

  2. 快速转发,也就是接收重定向:检测该类是否实现了forwardingTargetForSelector:方法,如果实现了这个方法,该方法返回值对象

  3. 慢转发: 在 resolveInstanceMethod 和 forwardingTargetForSelector: 都没有对消息进行处理,进入慢转发阶段。

  • 重写methodSiginatureForSelecor 手动生成方法签名。
  • forwardInvocation 中消息接受者根据签名完成消息转发。

最后如果这三个阶段没有处理的消息,系统会调用doesNotRecognizeSelector方法,抛出异常,对这个方法重写 防止崩溃 提高app体验。