1

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

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

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

4

1 回答 1

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通过正确地将消息调用转发到 _theObject向代理发送 printDescription 消息:

[((id)self) printDescription];

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

于 2012-11-30T14:10:07.213 回答