是否有任何方法可以获取(通过调试)Objective-c中未知对象的所有实例变量的列表?
我使用lldb进行调试,但我承认我不太了解它。
显然我无法查看这个未知对象的标题。
我需要在调试时执行此操作,但如果不可能,我可以在运行时使用替代方法。
我发现这篇文章:How do I list all fields of an object in Objective-C?但是,据我所知,我需要一个已知的类(我需要对象的标题)
有什么建议吗?
答案 0 :(得分: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;
}
然后考虑到你不知道类型的对象,如果它直接或间接地从 NSObject 继承,你只需要打印从这个方法返回的字典:
(lldb) po [someObject ivars]
致谢:How do I list all fields of an object in Objective-C?
PS:您需要导入 objc / runtime.h 。
答案 1 :(得分:3)
由于您使用的是lldb,因此您可能需要尝试
_ivarDescription
_propertyDescription
_methodDescription
_shortMethodDescription
遇到断点时,您可以将它们与po
一起使用
po [yourObject _ivarDescription]