NSProxy与forwardInvocation是否可能?

时间:2012-09-06 10:29:55

标签: objective-c nsproxy

我已经设置了NSProxy,forwardInvocation等来捕获传递给对象的消息 - 一切正常。

我还想做的是捕获自己传递的消息,例如:[self doSomething]或self.myVal = 5;

它似乎不起作用......这可能吗?

1 个答案:

答案 0 :(得分:2)

通过self或指向代理的其他变量向代理实例发送消息也没有什么不同。在引擎盖下,每个消息调度都转换为objc_msgSend()函数调用,将实例的地址作为接收者传递,因此,如果您使用self或“外部变量”,则无关紧要他们指向同一个对象。

为了确保,我已经通过实现NSProxy子类(TestProxy)将消息转发到NSObject子类(TestObject)来测试它。 TestObject有一个自定义方法打印出对象的描述:

@interface TestObject : NSObject
- (void)printDescription;
@end

代理具有以下方法被覆盖(_theObject是被代理的TestObject实例):

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL selector = [anInvocation selector];

    if ([_testObject respondsToSelector:selector])
        [anInvocation invokeWithTarget:_testObject];
}

- (BOOL)respondsToSelector:(SEL)aSelector
{
    return [_testObject respondsToSelector:aSelector];
}

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    return [_testObject methodSignatureForSelector:selector];
}

通过self向代理发送printDescription消息正确地将消息调用转发给_theObject:

[((id)self) printDescription];

如果您的问题是当您尝试将邮件直接发送到self而没有将其转发到id时,编译器会给您错误,那么我的猜测是没有办法解决这个问题。由于编译器无法检测self(代理)类的接口中的方法,并且不够聪明,无法确定这实际上是另一个类的代理,因此它会给您错误。