我已经设置了NSProxy,forwardInvocation等来捕获传递给对象的消息 - 一切正常。
我还想做的是捕获自己传递的消息,例如:[self doSomething]或self.myVal = 5;
它似乎不起作用......这可能吗?
答案 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
(代理)类的接口中的方法,并且不够聪明,无法确定这实际上是另一个类的代理,因此它会给您错误。