热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在LLDB控制台中使用Swift的_printHierarchy?》经验,为你挑选了2个好方法。

Apple 在iOS8中添加了一个私有助手_printHierarchy,可以在LLDB控制台中使用:

po [[[UIWindow keyWindow] rootViewController] _printHierarchy]

它以文本形式打印出整个视图控制器层次结构.

这只适用于在Objective C上调试代码.但是,在Swift中,这不起作用:

(lldb) po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
error: :1:13: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
            ^
           ,
:1:24: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
                       ^
                      ,
:1:44: error: expected ',' separator
[[[UIWindow keyWindow] rootViewController] _printHierarchy]
                                           ^
                                          ,

Swift中的等效用法也不起作用:

po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy

最终出现错误(可能是因为_printHierarchy是私人财产):

(lldb) po UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy()
error: :1:64: error: 'UIViewController' does not have a member named '_printHierarchy'
UIApplication.sharedApplication().keyWindow!.rootViewController!._printHierarchy
                                                               ^ ~~~~~~~~~~~~~~~

问题是:如何在Swift中打印出视图控制器层次结构?或者,即使在Swift项目中,如何在LLDB控制台中使用ObjC?



1> Rob..:

您指出了如何使用以下方式显示视图控制器层次结构:

po [[[UIWindow keyWindow] rootViewController] _printHierarchy]

然后你说:

这只适用于在Objective C上调试代码.但是,在Swift中,这不起作用.

实际上,这取决于你如何暂停执行Swift程序.问题是expression命令(po使用)将在Swift帧中使用Swift表达式,在Objective-C帧中使用Objective-C表达式.因此,这意味着po行为会根据执行暂停的方式而有所不同:

例如,您可以在应用运行时按"暂停"按钮:

暂停

如果这样做,您将能够将上述po语法与Objective-C表达式一起使用而不会发生意外.

另一方面,如果在Swift代码中设置了一个断点,当你到达(lldb)提示符时,你将处于一个Swift框架中.但是您可以expression通过-l(或--language)选项明确告诉命令您要使用Objective-C语法:

expr -l objc++ -O -- [[[UIWindow keyWindow] rootViewController] _printHierarchy]

在LLDBexpr中的WWDC 2014视频高级Swift调试中讨论了在命令中指定语言的能力.



2> rob mayoff..:

如果您在Swift代码中停止,请将此行粘贴到调试器控制台中(在(lldb)提示之后),然后按Enter键以打印根视图控制器的层次结构:

po UIWindow.value(forKeyPath: "keyWindow.rootViewController._printHierarchy")!

如果您在Objective-C代码或汇编代码中停止,请改用此行:

po [UIWindow valueForKeyPath:@"keyWindow.rootViewController._printHierarchy"]


推荐阅读
author-avatar
mobiledu2502881447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有