2012-09-06 141 views
1

我设置了NSProxy,forwardInvocation等来捕获传递给对象的消息 - 它一切正常。我想要做的就是捕获自身传递的消息,例如:[self doSomething]或self.myVal = 5;NSProxy with forwardInvocation with self - possible?

它似乎没有工作......这可能吗?

+0

我回答了你的问题吗? –

+0

理论上是的!虽然没有机会尝试 – akbsteam

回答

2

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

为了确保,我已经通过实现将消息转发给NSObject子类(TestObject)的NSProxy子类(TestProxy)进行了测试。的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]; 
} 

发送printDescription消息到通过self代理正确转发消息调用_theObject:

[((id)self) printDescription]; 

如果你的问题是,编译器会发出哟当您尝试直接发送邮件到self而不将它投射到id时出现错误,那么我的猜测是没有办法治愈这种情况。由于编译器无法检测到self(代理)类的接口中的方法,并且不够智能地发现这实际上是另一个类的代理,所以它会给你带来错误。