2011-07-25 21 views
3

我正在寫一個記錄器類轉發到方法(誰不?),用方法捕獲在ObjC不確定的消息,並將其與不同的簽名

- (void) logWithTag:(NSString *)aTag andMessage:(NSString *)aMsg; 

我希望能夠轉發未定義的消息到這個方法。例如:

[myLogger logFoo:@"bar"] should call [myLogger logWithTag:@"Foo" andMessage:@"bar"] 

和更一般

[myLogger logXXX:@"bar"] should call [myLogger logWithTag:@"XXX" andMessage:@"bar"] 

我已經看了resolveInstanceMethod和消息轉發,但是從我的理解,他們都期望該方法具有相同的簽名。

有什麼想法? 謝謝!

回答

3

蘋果在Objective-C Runtime Programming Guide報道這個。基本上,您需要覆蓋respondsToSelector:並返回YES,如果您想支持該方法。然後也覆蓋forwardInvocation:,然後捕獲選擇器字符串,刪除日誌前綴,並創建一個新的NSInvocation,將呼籲logWithTag:andMessage:

+0

謝謝!我也不得不調用methodSignatureForSelector:但它的工作方式像一個魅力(除了編譯器抱怨logXXX不存在,但我想我可以忍受這一點)! –

+0

哎呀我打算警告你這個警告,你需要做的就是將記錄器作爲類型('id')。如果您的記錄器是由單身人士返回,那麼只需在那裏將返回類型更改爲'id'。 – Joe

+0

@Joe:如果方法沒有在任何地方聲明,那麼不管你怎麼稱呼它,你都會得到一個不存在的警告。 – user102008

相關問題