【发布时间】:2013-05-15 01:44:46
【问题描述】:
如何使用 Xcode 调试器(lldb 或 gdb)来确定存储在 NSArray 中的对象类型?
【问题讨论】:
标签: objective-c xcode4.5 lldb
如何使用 Xcode 调试器(lldb 或 gdb)来确定存储在 NSArray 中的对象类型?
【问题讨论】:
标签: objective-c xcode4.5 lldb
gdb 和 lldb 都支持对内存中的对象调用方法,您可以使用po 打印对象。要获取NSArray 中所有对象的某些属性的值列表,请使用valueForKey:。您似乎感兴趣的属性是class。
综合起来:
po [theArray valueForKey:@"class"]
【讨论】:
在 lldb 中执行此操作的另一种方法是使用 lldb 的数据格式化程序的组合 - 其中包括将 NSArray 对象呈现为“真实”数组的工具 - 以及 expr 中的“动态类型”工具 - 提取真实的,与声明的对象类型相反。比如:
(lldb) expr -T -d run-target -- *array1
(NSArray) $2 = {
(__NSCFConstantString *) [0] = 0x0000000100002590 @"array1 object1"
(__NSCFConstantString *) [1] = 0x00000001000025b0 @"array1 object2"
(__NSCFConstantString *) [2] = 0x00000001000025d0 @"array1 object3"
}
-T 选项刚刚打开了类型打印。 NSArray“合成子提供者”将数组呈现为对象的索引数组。默认情况下这是有效的,我不需要做任何事情来打开它。而动态类型选项-d 正在解码每个对象的真实类型。请注意,您可以通过执行以下操作将动态类型设置为 lldb 中的默认值:
(lldb) set set target.prefer-dynamic-value run-target
这个数组似乎充满了 __NSCFConstantStrings,这显然是常量 NSStrings 的支持类型。
【讨论】:
在 Xcode 4.6 或更高版本中,Xcode UI 将为您显示该信息
【讨论】: