Xcode 6.4 / LLDB:如何与对象资源管理器中显示的 UIKit 对象的私有 class 成员交互
Xcode 6.4 / LLDB: How to interact with private class members of UIKit objects revealed in object explorer
经常在调试时(并且出于好奇)我展开左侧的对象资源管理器并看到许多 UIKit 对象的“_”前缀字段,例如,UINavigationBar
,如下图所示。
有很多像 _titleView
这样的字段必须非常私密,甚至在跳转到 class 定义时都不会显示。
此外,对象资源管理器显示 class 类似 UINavigationItemView
的文档甚至没有,并且 lldb 提示否认知道。
(这可能是问题的一部分:UINavigationItem.h 有 __attribute__((visibility("hidden")))
@interface UINavigationItemView : UIView { ... }
)
再次主要是出于好奇,但想阐明此事。
这些实例变量来自Objective-C运行时类型信息
Objective-C 运行时以名称和类型编码 (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)
的形式存储有关 类 的 iVar 的信息
调试器知道如何查看该运行时信息,并根据该信息生成对象内部结构的表示
但是,在使 Objective-C 类型可用于您的 Swift 代码时,语言不会使用该信息
部分原因是此运行时信息可能不正确或不完整,这当然可以通过将错误情况列入黑名单来解决(NSURL 是一个典型的例子,还有一些注意事项)
但是,一般来说,来自运行时的 iVar 信息是实现细节,绝对不是类型的 public 接口的一部分。在调试器中查看它很有用,但在 Swift 中它没有作为类型接口的一部分公开。这解释了一个事实,即虽然您可以在变量视图中看到数据,但实际上无法评估涉及它的表达式
经常在调试时(并且出于好奇)我展开左侧的对象资源管理器并看到许多 UIKit 对象的“_”前缀字段,例如,UINavigationBar
,如下图所示。
有很多像 _titleView
这样的字段必须非常私密,甚至在跳转到 class 定义时都不会显示。
此外,对象资源管理器显示 class 类似 UINavigationItemView
的文档甚至没有,并且 lldb 提示否认知道。
(这可能是问题的一部分:UINavigationItem.h 有 __attribute__((visibility("hidden")))
@interface UINavigationItemView : UIView { ... }
)
再次主要是出于好奇,但想阐明此事。
这些实例变量来自Objective-C运行时类型信息
Objective-C 运行时以名称和类型编码 (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)
的形式存储有关 类 的 iVar 的信息调试器知道如何查看该运行时信息,并根据该信息生成对象内部结构的表示
但是,在使 Objective-C 类型可用于您的 Swift 代码时,语言不会使用该信息
部分原因是此运行时信息可能不正确或不完整,这当然可以通过将错误情况列入黑名单来解决(NSURL 是一个典型的例子,还有一些注意事项)
但是,一般来说,来自运行时的 iVar 信息是实现细节,绝对不是类型的 public 接口的一部分。在调试器中查看它很有用,但在 Swift 中它没有作为类型接口的一部分公开。这解释了一个事实,即虽然您可以在变量视图中看到数据,但实际上无法评估涉及它的表达式