Xcode 6.4 / LLDB:如何与对象资源管理器中显示的UIKit对象的私有类成员进行交互

时间:2015-08-05 18:13:18

标签: ios xcode swift uikit lldb

通常在调试时(出于好奇心),我在左边展开了对象浏览器并看到了很多' _' UIKit对象的前缀字段,例如UINavigationBar,如下图所示。

_titleView这样的很多字段必须是非常隐私的,甚至在跳到课程定义时都没有透露。

此外,对象浏览器会显示类似UINavigationItemView的类,文档甚至没有,以及lldb提示拒绝了解。

(这可能是问题的一部分:UINavigationItem.h有__attribute__((visibility("hidden"))) @interface UINavigationItemView : UIView { ... }

再次主要是出于好奇,但希望阐明此事。Debugger output

1 个答案:

答案 0 :(得分:0)

这些实例变量来自Objective-C运行时类型信息

Objective-C运行时以名称和类型编码的形式存储有关类的iVars的信息(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html

调试器知道如何查看该运行时信息,并根据该信息生成对象内部内容的表示

但是,当您的Swift代码可以使用Objective-C类型时,该语言不会使用该信息

故事的一部分是这个运行时信息可能是不正确的或不完整的,当然可以通过将错误的案例列入黑名单来解决(NSURL作为一个典型的例子出现在脑海中,还有一些警告)

但是,通常,来自运行时的iVar信息是实现细节,并且绝对不是类型的公共接口的一部分。在调试器中查看它很有用,但它不作为Swift中类型接口的一部分公开。这解释了这样一个事实:虽然您可以在变量视图中看到数据,但您无法实际评估涉及它的表达式