2011-06-22 52 views
1

我創建了一個新的函數來記錄運行時類中的每個方法。如何在運行時記錄參數?

,我的問題是,在這條線:

id value = va_arg(stackFrame, id); 

不轉換的對象類型的參數內。

任何想法我做錯了什麼?有沒有另一種方法來做到這一點?

void DebugArguments (id self, SEL _cmd,...) 

{

id receiver = self; 
SEL receiverSelector = _cmd; 

va_list stackFrame; 

va_start(stackFrame, _cmd); 

NSMethodSignature *signature 
= [receiver methodSignatureForSelector:receiverSelector]; 

NSUInteger count = [signature numberOfArguments]; 

NSUInteger index = 2; 

for (; index < count; index++) 
{ 

    id value = va_arg(stackFrame, id); 
     if (!value) 
     { 
      NSLog(@"Arguments: %@",value);  
     } 
} 
va_end(stackFrame); 

}

+0

你真的不清楚你在問什麼,我敢肯定你已經包含了很多與代碼無關的代碼 - 嘗試減少代碼量並且確切地說明你的代碼當前的功能是什麼錯誤和你想要發生的事情。 – JosephH

+1

我調用函數InitDebug從一類這樣的: - (空)MyTest的:(* NSString的)串 { InitDebug(個體經營,_cmd); \t } 我希望從方法MyTest記錄參數字符串。 – Willy

+0

什麼是結果類型的'價值',你期望什麼? –

回答

1

我打電話從這樣的一類功能InitDebug: - (無效)MyTest的:(的NSString *)字符串{
InitDebug( self,_cmd); }我希望 記錄來自 方法MyTest的參數字符串。

將來,顯示所有代碼很有幫助。

無論如何,你不能這樣做;當您撥打InitDebug(...)時,您正在將新幀推入堆棧,並且va_arg()將在該幀的上下文中解碼,而不是周圍的幀。你也不能「走上堆棧」,並開始討論調用框架的參數,因爲不能保證調用框架甚至保留在那個點上。

如果你真的想做這樣的事情,你可能想要子類NSProxy並使用它是調用者和任何你想記錄的對象之間的代理。然後,您可以利用Objective-C的內置轉發機制來解決這些爭論。

相關問題