- (void) forwardInvocation: (NSInvocation*)invocation
{
if ([forwardee respondsToSelector: [invocation selector]])
return [invocation invokeWithTarget: forwardee];
else
return [self doesNotRecognizeSelector: [invocation selector]];
}
1. invocation是一个特殊类NSInvocation的对象,这个对象包含了原始消息的所有信息,比如它的selector和参数。
2. forwardee是一个实例变量,它里面存储着一个对象的id,这个对象是最有可能相应原来那个对象没能效应的消息的。
3. NSInvocation类有个很方便的方法,可以将原来那个没被实现的消息作为一个参数传递给目标对象。
4. doesNotRecognizeSelector方法是一个NSObject类的回调方法,除非这个方法被重写过,它的作用是报出一个” NSInvalidArgumentException”异常,程序将终止执行。
转发消息是软件编写中的强力武器。它可以用于实现一种多继承,大家知道Objective-C是单继承的。但是消息转发无法实现类似respondsToSelector 和 isKindOfClass:方法这样的功能,因为上面两个方法是通过搜索类的继承路径来实现的,它们无法查询到消息转发路径。
转发消息还可以用于一个代理对象(surrogate object)。代理对象可以将消息转发给某个可以响应消息的更复杂的类的对象。代理对象的forwardInvocation:方法可以将收到的消息转发给其它对象。如果需要接收消息的对象不存在,这个代理对象还可以创建这个对象。Proxy对象(代理服务器)是代理对象的典型应用。在远程调用或者你想让一个对象实现另一个对象功能的场景中,Proxy对象会变得非常有用。
编程学习 Objective-C 高级消息机制 转发Forwarding 转载请保留此行.谢谢.