Apple 添加了一个 private helper _printHierarchy
in iOS8可以在 LLDB 控制台中使用:
po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
以文本形式打印出整个 View Controller 层次结构。
这仅在您在 Objective C 上调试代码时有效。然而,在 Swift 中,这不起作用:
(lldb) po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
error: <EXPR>:1:13: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
<EXPR>:1:24: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
<EXPR>:1:44: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
^
,
Swift 中的等效用法也不起作用:
po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy
以错误结束(可能是因为 _printHierarchy
是私有(private)属性):
(lldb) po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy()
error: <EXPR>:1:64: error: 'UIViewController' does not have a member named '_printHierarchy'
UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy
^ ~~~~~~~~~~~~~~~
问题是:如何在 Swift 中打印出 View Controller 层次结构?或者有没有办法在 LLDB 控制台中甚至在 Swift 项目中使用 ObjC?
最佳答案
您指出如何显示 View Controller 层次结构:
po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
然后你说:
This works only if you are debugging code on Objective C. In Swift, however, this doesn't work.
实际上,这在一定程度上取决于您暂停 Swift 程序执行的方式。问题在于 expression
命令(po
使用)将在 Swift 框架中使用 Swift 表达式,在 Objective-C 框架中使用 Objective-C 表达式。因此,这意味着 po
行为会根据执行暂停的方式而变化:
例如,您可以在应用程序运行时按“暂停”按钮:
如果这样做,您将能够毫无意外地将上述
po
语法与 Objective-C 表达式一起使用。另一方面,如果您在 Swift 代码中设置断点,则当您到达
(lldb)
提示符时,您将处于 Swift 框架中。但是您可以通过-l
(或--language
)选项明确告诉expression
命令您想要使用 Objective-C 语法:expr -l objc++ -O -- [[[UIWindow keyWindow] rootViewController] _printHierarchy]
在 WWDC 2014 视频 Advanced Swift Debugging in LLDB 中讨论了这种在 expr
命令中指定语言的能力.
关于ios - 如何使用 Swift 在 LLDB 控制台中使用 _printHierarchy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966453/