消息转发分为两阶段,第一阶段先征询接受者,所属的类,看起能否动态添加方法,已处理当前这个“未知的方法”,这叫做动态解析方法。第二阶段涉“完整的消息转发机制”,如果运行期系统已经把第一阶段执行完成,纳闷接受者自己以其他手段处理与消息相关的方法调用。这又细分为两部,首先,请接受者看看有没有其他对象能处理这条消息,若有,这运行其系统会把消息转给那个对象,消息转发过程结束,若没有“备用接收者”,则启动完整的消息转发机制,运行期系统会把与消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会,令其解决当前还未处理的消息。
动态方法解析
对象在收到无法解析的消息后,首先调用其所属类的下列类方法:
+(BOOL)resolveInstanceMethod:(SEL)sel
该方法参数就是一个未知的选择子,其返回值为Boolean类型,表示这个类是否能新增一个实力方法用以处理改选择子。在继续往下执行转发之前,本类有机会新增一个处理此选择子的方法。加入尚未实现的方法不是实例方法而是类方法,那么运行期系统就会调用另一个方法
+(BOOL)resolveClassMethod:(SEL)sel
使用这种方法的前提是:相关方法的代码已经写好,只等运行的时候动态插在类里面就可以
备援接受者
当前接受者还有第二次机会能处理位置的选择子,在这一部中,运行期系统会问它能不能把消息转给其他接受者来处理,对应的处理方法如下:
-(id)forwardingTargetForSelector:(SEL)aSelector
方法参数代表未知的选择子,若当前接受者能找到备援对象,则将其返回,若找不到,就返回nil,通过这个方法,可以用“组合”来模拟出“多重继承”的某些特性
完整的消息转发
使用
-(void)forwardInvocation:(NSInvocation
方法,实现此方法时,如发现某调用操作不应该由本类处理,则需要调用超类的同名方法,直至NSobject,如果最后调用了nsobject类的方法,那么改方法会继而调用“doesNotRecognizeSelector:”以抛出异常,表明未处理