【问题标题】:Debugging UIViews missing subviews member in variable list of debugger调试 UIViews 在调试器的变量列表中缺少子视图成员
【发布时间】:2010-11-24 13:21:41
【问题描述】:

今天在我的代码中搜索错误时,我发现了一件奇怪的事情。在调试器中检查 UIView 实例时,Xcode 的变量视图不显示 UIView 类的 subviews 成员。

我只在调试器中看到这个字段(>应该表示开口三角形):

  • UIResponder

  • _层

  • _tabInfo

  • _gestureInfo

  • _touchData

  • _充电
  • _tag
  • _viewFlags

我错过了 _subviews 成员,并且想到了所有位置成员(至少其中一个应该在那里)。

有谁知道我遗漏了什么或做错了什么(据我所知这不是问题,因为谷歌搜索这个问题没有得到任何结果)。

我使用 Xcode 3.1.3 版:

  • XcodeIDE:1191.0
  • XcodeCore:1192.0
  • Xcode 支持:1186.0

在装有 OS 10.5.7 和 iPhone SDK 2.2.1 的 Mac 上(我还使用 iPhone SDK 3.0 进行了测试)。

我希望有人对此有所了解。它给了我一种奇怪的感觉,我不能相信调试器会告诉我调试问题时我应该知道的一切。如果您需要不信任您的工具,那就不好了:(

【问题讨论】:

  • UIView 没有子视图成员。查看 UIView.h 文件。
  • 这很有趣。但是有一个名为 subviews 的属性,您可以使用它来迭代代码中的所有子视图。在头文件中进一步查看时,我看到了该属性,它在 UIView 类别中定义:@interface UIView(UIViewHierarchy) 同样适用于我缺少的框架属性。因此,调试器无法显示类别中定义的成员。并感谢 .h 文件的提醒,我在编写任务时完全忘记了看那里 oO 这个结构接缝在我在这里拥有的所有 UIView.h 文件中都是相同的

标签: iphone xcode debugging uiview subview


【解决方案1】:

调试器只能显示成员,不能显示属性。请记住,这两者在 Objective C 中是不同的。属性只是 setter 和/或 getter 的语法糖。所以 UIView 的只读“subviews”属性只保证它有这个方法的实现:

- (NSArray *)subviews;

正如您所注意到的,Apple 已经使用未记录的成员变量来实现其许多属性,这些成员变量类似于其相应的属性名称,但带有前导下划线。这使您可以窥探某些对象的内部,以了解在某些情况下发生了什么,但许多属性并未以如此透明的方式实现。在这些情况下,您需要将一些诊断代码注入您的应用程序以访问该属性并使用 NSLog 输出其返回值,和/或将值存储在您可以在调试器中观察到的临时变量中。

不要责怪可怜的调试器。它正在做它设计要做的事情。如果它有帮助,你可以责怪属性试图欺骗我们,让我们认为它们是成员变量,而实际上它们是方法。

【讨论】:

  • 好的,我现在明白问题所在了。感谢您的帮助。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2021-12-15
相关资源
最近更新 更多