我設置了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