既然是消息发送,就存在消息发送失败的时候。那消息发送失败之后,runtime系统会怎么处理呢?
通常情况下,如果消息发送失败的话,程序会直接挂掉。但是程序在异常抛出前,会给你三次拯救程序的机会。
1.Method resolution //解决方法
2.Fast forwarding //快进
3.Normal forwarding //正常前进
Method resolution
runtime系统会调用resolveInstanceMethod或者resolveClassMethod,让你有机会提供一个函数实现。如果你添加了函数并返回YES,那运行时系统就会重新启动一次消息发送的过程。如果返回NO,运行时就会移动到下一步进行消息消息转发。
Fast forwarding
如果你实现了这个方法forwardingTargetForSelector,runtime系统就会调用这个方法,给你把这个消息转发给其他对象。只要你返回的不是nil和self,整个消息发送的过程就会被重启。当然发送的对象会变成你返回的那个对象。否则,会继续Normal Fowarding。
Normal forwarding
这是runtime系统最后给你的挽救机会