示例。我在旧项目中写了以下字符串,在新项目中写了一个清晰的字符串:
UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation;
用于清晰项目的控制台输入输出:
(lldb) po k
UIInterfaceOrientationLandscapeLeft
如果我写“ po k”-一个无用的整数列表,那在我的旧项目中会很糟糕。
另外,我不能在新项目中打印大多数对象。
我不知道您的情况如何,只是为了使大家清楚po
和p
之间的区别:
p
命令(又名expr --
)采用给定的参数,将它们编译为在当前帧的上下文中编写的源代码表达式,然后执行结果-通过在如果可能的话,通过编译结果或JIT编译结果,将其插入目标程序,然后在目标程序中运行。然后打印评估结果。
po
命令(又名expr --O --
)执行p
的所有操作,但是如果结果是指向ObjC对象的指针,则不打印结果,而是调用该对象的“描述”方法并打印该方法(*)返回的字符串。同样,如果结果是CF对象,它将调用CFShow并打印该结果。如果这两次尝试均失败,它将继续并按照p
的要求打印结果。
因此po
大部分类似于p
。但是,如果对实际上不是对象的东西使用po
,则可能会得到一些奇怪的结果。例如,ObjC进行了优化(标记指针),该优化表示对象指针中某些对象(例如NSNumbers)的内容。没有“真实的”对象,只有熟的指针。因此,如果您尝试po
一个恰好看起来像带标记的指针的整数,则将获得一些可能不相关的ObjC对象的描述,而不是该整数的值。
当然,po
还要做很多工作,因此,除非您真的想要某个对象的自身描述,否则p
会更有效率。
p
=打印
po
=打印对象
[p
打印原始变量的值或引用的值
[po
尝试为该对象调用-description并打印返回的字符串
UIInterfaceOrientation
不是(Objective-C)对象,而是整数(enum:NSInteger
)。您完全不应使用po
(打印object)。
似乎区别在于lldb / gdb调试器。 iOS项目使调试器更可行的唯一方法是expr @import UIKit
。但是它可能不适用于较早的xcode版本,并且...您需要在每次重新启动后在控制台中输入此字符串。自动化它的唯一方法是使用此表达式额外的断点。
p prints value of primitive variable or value of a reference
po try to call -description for that object and print returned string
There is also **v command** in lldb. Explaining using example.
protocol Activity {}
struct Trip: Activity {
var name: String
var destinations: [String]
}
let cruise: Activity = Trip(...)
Using v command
(lldb) v cruise.name
(string) cruise.name = "print name"
//As it uses dynamic resolution
Using p command
(lldb) p cruise.name
//execution interrupted
对于有兴趣了解更多信息的人:https://developer.apple.com/videos/play/wwdc2019/429/
将其作为可见性的答案,并解释每个调试命令的功能
Strip debug symbols during copy
[在大多数答案中,他们建议将优化设置为“ none”,但是忘记将此选项设置为NO(至少对于调试配置而言)。
这是参考吉姆·英厄姆所说的。输入“ p”而不是“ po”。当我这样做时,Xcode将显示正确的信息。试试看。