2012-09-06 139 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(代理)類的接口中的方法,並且不夠智能地發現這實際上是另一個類的代理,所以它會給你帶來錯誤。