利用已鏈接問題的接受答案的代碼,唯一需要做的就是將其包裝成一個方便的方法,以便在調試期間隨時調用它。在你的地方,我會寫一個類別擴展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。
是的,這非常好!附加信息:如果您想打印有關未知對象ivars的信息(比如說:私人Apple對象),則必須爲該類創建一個假頭,包括ivars。否則,lldb會給你一個錯誤。非常感謝你! – LombaX 2013-04-30 21:32:03
+1,很好,詳細的答案。 – Maroun 2013-05-25 20:52:02