首先我们看下objc_msgSend 是具体如何发送消息的
- 首先根据对象的指针去获取对应的类
- 在类的cache中查找方法, 如果找不到,在到methodLists查找
- 如果没有在类中查找到方法,再到父类去查找 重复这操作继续查找
- 如果找到message方法,在根据receirver中的self 指针找当前对像,调用当前对象的imp, 传递参数,调用实现方法。
- 最后如果都没找到改方法,这时候进入消息转发机制大致如下:
解释一下
-
动态解析: + (BOOL)resolveInstanceMethod:(SEL)sel;
-
快速转发,也就是接收重定向:检测该类是否实现了forwardingTargetForSelector:方法,如果实现了这个方法,该方法返回值对象
-
慢转发: 在 resolveInstanceMethod 和 forwardingTargetForSelector: 都没有对消息进行处理,进入慢转发阶段。
- 重写methodSiginatureForSelecor 手动生成方法签名。
- forwardInvocation 中消息接受者根据签名完成消息转发。
最后如果这三个阶段没有处理的消息,系统会调用doesNotRecognizeSelector方法,抛出异常,对这个方法重写 防止崩溃 提高app体验。