debug:获取对象的所有实例变量的列表(未知类型)

Lom*_*baX 5 debugging gdb objective-c lldb

是否有任何方法可以获取(通过调试)Objective-c中未知对象的所有实例变量的列表?

我使用lldb进行调试,但我承认我不太了解它.

显然我无法查看这个未知对象的标题.

我需要在调试时执行此操作,但如果不可能,我可以在运行时使用替代方法.

我发现这篇文章:如何在Objective-C中列出对象的所有字段?但是,据我所知,我需要一个已知的类(我需要对象的标题)

有什么建议吗?

Ram*_*uri 13

利用您链接的问题的接受答案的代码,您唯一需要做的就是将其包装到一个方便的方法中,以便您可以在调试期间随时调用它.在你的位置,我会写一个扩展NSObject的类别,添加一个返回带有所有ivars 的NSDictionary的方法; 这是一个例子:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

然后给定你不知道类型的对象,如果它直接或间接地从NSObject继承,你只需要打印从这个方法返回的字典:

(lldb) po [someObject ivars]
Run Code Online (Sandbox Code Playgroud)

致谢:如何在Objective-C中列出对象的所有字段?

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


xi.*_*lin 9

由于您使用的是 lldb,您可能想尝试

_ivarDescription
_propertyDescription
_methodDescription
_shortMethodDescription
Run Code Online (Sandbox Code Playgroud)

您可以po在遇到断点时使用它们

po [yourObject _ivarDescription]
Run Code Online (Sandbox Code Playgroud)