3

为什么我看到的是内存地址而不是我刚刚添加到 NSMutableArray 的“测试”字符串?如何查看实际的对象内容?

(lldb) p [autocompleteUrls addObject:@"test"]
(lldb) p [autocompleteUrls objectAtIndex:0]
(id) $8 = 0x00006e28

我也尝试将它转换为 NSString 但这给出了错误

(lldb) p (NSString*)autocompleteUrls[1]
错误:不允许从“id”到“NSString”的 C 样式转换
4

2 回答 2

6

在 LLDB 中,
“p”是“打印”非对象
的快捷方式,“po”是“打印对象”的快捷方式,用于打印对象

您可能想要的是:
“po autocompleteUrls”
这将打印 autocompleteUrls 对象的内容

"p [autocompleteUrls addObject:@"test"]"
打印返回的方法调用的结果void

有关好的教程,请参阅 Cocoa Is My Girlfriend:Xcode LLDB 教程

于 2013-11-14T04:53:19.560 回答
2

这是 Zaph 出色答案的技术扩展,只是为了让事情看起来不那么神奇......

lldbp命令打印您提供给它的表达式的内存内容,无论表达式解析为对象还是其他数据类型。

因此,例如,如果您有一个带有 ivar 的 ObjC 对象p *object将打印 ivars。

lldbpo命令评估您提供给它的表达式,而不是直接打印它,它首先尝试调用它的debugDescription方法。如果对象的类没有实现该方法,它会尝试调用该description方法,最后如果对象是 CF 对象,它会尝试调用CFShow

对于真正令人讨厌的 lldb 实际所做的是调用 Foundation 例程_NSPrintForDebugger并传入返回的指针,该函数就是实现上述逻辑的函数......

因此,对象的区别在于p打印对象的实际内容,po打印类的实现者认为适合您查看的对象描述。当然,大多数套件对象都非常不透明,因此实际内容往往不是很有帮助,这就是添加描述方法的原因。

于 2013-11-15T19:02:34.790 回答