ios - 如何使用 Swift 在 LLDB 控制台中使用 _printHierarchy?

标签 ios swift ios8 xcode6 lldb

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 行为会根据执行暂停的方式而变化:

  • 例如,您可以在应用程序运行时按“暂停”按钮:

    pause

    如果这样做,您将能够毫无意外地将上述 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/

相关文章:

swift - 以编程方式禁用推送通知

ios - 如何知道 iOS 8 中的当前 interfaceOrientation?

swift - 我如何知道最后按下了哪个按钮 - SWIFT?

swift - iOS 8 中的 TextView,导航栏位于 TextView 上方

ios - 无法编辑屏幕截图,performChanges block 失败

ios - Itunes 连接团队未在 Xcode 中显示

ios - UICollectionView 动画单元格大小更改会导致不良行为

ios - Swift Playground 错误 : Execution was interrupted, 原因:信号 SIGABRT

ios - 应用程序连接错误 : AppConnect cannot be instantiated directly

Swift 类自定义类型属性