我设置了NSProxy,forwardInvocation等来捕获传递给对象的消息 - 它一切正常。我想要做的就是捕获自身传递的消息,例如:[self doSomething]或self.myVal = 5;NSProxy with forwardInvocation with self - possible?
它似乎没有工作......这可能吗?
我设置了NSProxy,forwardInvocation等来捕获传递给对象的消息 - 它一切正常。我想要做的就是捕获自身传递的消息,例如:[self doSomething]或self.myVal = 5;NSProxy with forwardInvocation with self - possible?
它似乎没有工作......这可能吗?
通过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
(代理)类的接口中的方法,并且不够智能地发现这实际上是另一个类的代理,所以它会给你带来错误。
我回答了你的问题吗? –
理论上是的!虽然没有机会尝试 – akbsteam