2013-04-30 31 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