1.当对象接收到无法解读的消息之后,就会启动消息转发机制,程序员可经由此告诉对象应该如何处理位置消息。
2.消息转发分为两大阶段。第一阶段先征询接受者。所属的类,看其能否动态添加方法,已处理当前这个位置的选择子,这个叫做动态方法解析。第二阶段涉及完整的消息转发机制,如果运行期系统已经把第一阶段执行完了,那么接受者自己就无法在以动态新增方法的手段来响应包含选择子的消息了,接下来就会以其他手段来处理与消息相关的方法调用,
分为两步:a.请接受者看看有没有其他对象能处理这条消息。有的话就把消息给他。b.如果没有备源接收者则启动完整的消息转发机制,运行期系统会把与消息有关的全部细节都封装到NSInvocation对象中。再给接收者最后一次机会。
3.resolveInstanceMethod:(SEl)selector 返回值表示这个类能否新增一个实例方法泳衣处理此选择子,在继续往下执行转发机制之前,本类有机会新增一个处理此选择子的方法。如果添加的是类方法。叫做resolveClassMethod。
4.如果类不能动态解析选择子,则会启动备援接收者,-(id)forwardingTargetForSelector:(SEL)selector,方法参数代表位置的选择子,若当前接受者能找到备援对象,则将其返回,若找不到就返回nil。
5.完整的消息转发
如果转发算法已经来到这一步的话,那么唯一能做的就是启动完整的消息转发机制了,首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封装于其中。此对象包含选择子,目标及参数。在出发NSInvocation对象时,消息派发系统将亲自出马,把消息指派给目标对象。
-(void)forwardInvocation:(NSInvocation *)invocation
6.接收者在每一步中均有机会处理消息,步骤越往后。处理消息的代价就越大。最好能在第一步就处理完,这样的话,运行期系统就可以将此方法缓存起来了,如果这个类的实例稍后还收到同名选择子,那么根本就无需启动消息转发流程。
网友评论