2

你如何使用 Xcode 调试器(lldb 或 gdb)来确定存储在 NSArray 中的对象的类型?

4

3 回答 3

5

gdb 和 lldb 都支持对内存中的对象调用方法,并且可以使用po. 要获取 中所有对象的某些属性的值列表NSArray,请使用valueForKey:。您似乎感兴趣的属性是class

把所有这些放在一起:

po [theArray valueForKey:@"class"]
于 2013-05-15T02:17:19.760 回答
1

在 Xcode 4.6 或更高版本中,Xcode UI 将为您显示该信息

于 2013-05-15T15:04:56.303 回答
1

在 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 的支持类型。

于 2013-06-07T22:33:47.770 回答