2013-04-30 34 views
4

是否有任何方法來獲取(通過調試)在Objective-c中的未知對象的所有實例變量的列表?調試:獲取對象的所有實例變量(未知類型)的列表

我使用lldb進行調試,但我承認我不太瞭解它。

顯然我不能看這個未知對象的標題。

我需要在調試時做到這一點,但如果這是不可能的,我可以在運行時使用替代。

我發現這個職位:How do I list all fields of an object in Objective-C?但是,據我瞭解,我需要有一個已知的類(我所需要的對象的標題)

什麼建議嗎?

回答

13

利用已鏈接問題的接受答案的代碼,唯一需要做的就是將其包裝成一個方便的方法,以便在調試期間隨時調用它。在你的地方,我會寫一個類別擴展NSObject,添加一個方法返回一個NSDictionary與所有的ivars;這裏有一個例子:

- (NSDictionary*) ivars 
{ 
    NSMutableDictionary* ivarsDict=[NSMutableDictionary new]; 
    unsigned int count; 
    Ivar* ivars=class_copyIvarList([self class], &count); 
    for(int i=0; i<count; i++) 
    { 
     Ivar ivar= ivars[i]; 
     const char* name = ivar_getName(ivar); 
     const char* typeEncoding = ivar_getTypeEncoding(ivar); 
     [ivarsDict setObject: [NSString stringWithFormat: @"%s",typeEncoding] forKey: [NSString stringWithFormat: @"%s",name]]; 
    } 
    free(ivars); 
    return ivarsDict; 
} 

然後給那個對象,其中你不知道的類型,如果它直接或間接地從繼承NSObject的你只需要打印的字典此方法返回:

(lldb) po [someObject ivars] 

學分:How do I list all fields of an object in Objective-C?

PS:您需要導入objc/runtime.h

+0

是的,這非常好!附加信息:如果您想打印有關未知對象ivars的信息(比如說:私人Apple對象),則必須爲該類創建一個假頭,包括ivars。否則,lldb會給你一個錯誤。非常感謝你! – LombaX 2013-04-30 21:32:03

+0

+1,很好,詳細的答案。 – Maroun 2013-05-25 20:52:02