为什么我会看到内存地址而不是" test"我刚刚添加到NSMutableArray的字符串?如何查看实际的对象内容?
(lldb) p [autocompleteUrls addObject:@"test"] (lldb) p [autocompleteUrls objectAtIndex:0] (id) $8 = 0x00006e28
我还尝试将其强制转换为NSString,但却出错了
(lldb) p (NSString*)autocompleteUrls[1] error: C-style cast from 'id' to 'NSString' is not allowed
答案 0 :(得分:6)
在LLDB中 “p”是“打印”非物体的捷径 “po”是打印对象的“print-object”的快捷方式
你可能想要的是:
“po autocompleteUrls”
那将打印autocompleteUrls对象的内容
“p [autocompleteUrls addObject:@”test“]”
打印返回void
的方法调用的结果。
要获得一个好的教程,请参阅Cocoa Is My Girlfriend:Xcode LLDB Tutorial
答案 1 :(得分:2)
这是Zaph优秀答案的技术扩展,只是为了让事情看起来不那么神奇......
lldb p
命令打印您为其提供的表达式的内存内容,无论表达式是否解析为对象或其他某种数据类型。
例如,如果你有一个带有ivar p *object
的ObjC对象将打印ivars。
lldb po
命令评估您为其提供的表达式,而不是直接打印它,它首先尝试在其上调用debugDescription
方法。如果对象的类没有实现该方法,那么它将尝试调用description
方法,最后如果对象是CF对象,它将尝试CFShow
。
对于真正令人讨厌的lldb实际上做的是调用基因例程_NSPrintForDebugger
传入返回的指针,该函数是实现上述逻辑的...
因此,对象的差异是p
打印对象的实际内容,po
打印该类的实现者认为适合您查看的对象的描述。当然,大多数套件对象都是非常不透明的,因此实际内容通常不是很有用,这就是添加描述方法的原因。