【问题标题】:Debugging properties in XcodeXcode 中的调试属性
【发布时间】:2012-04-19 13:46:03
【问题描述】:

所以我在一些我正在使用的示例代码中使用了一些属性。尤其是 UIView 类的“标签”属性。现在我设置了这个属性,如果我NSLog它,或者根据标签的值设置控制语句,我可以看到我设置的值在那里,并且按预期执行。

但是,如果我将鼠标悬停在 .tag 上以查看存在哪个标记值,则 Xcode 将一无所获。没有弹出显示值。然后我转到自动/本地/所有窗口并尝试“添加表达式...”(似乎这是设置传统“监视”变量的唯一方法,如果有其他方法,请告诉我)。无论如何,所以我将我的 object.tag 放入“监视”窗口,它是空白的。没有价值。它不是零,它什么都不是,就好像它不存在一样。

当然,如果我将鼠标悬停在“object.tag”的“object”部分上,我会弹出一个带有展开三角形的对象,然后我会去寻找“_tag”(似乎是底层实例变量)。

那么这有什么难的呢?为什么仅将鼠标悬停在调试期间无法查看标签属性?这与 Xcode 开发中的属性有关吗?

我正在运行 Xcode 4.3.2

【问题讨论】:

    标签: objective-c ios xcode


    【解决方案1】:

    tag 属性与任何其他 Objective-C 属性一样,是一种语法糖。实际上,属性是作为访问器方法实现的,而访问器方法又会被转换为objc_msgSend() 函数调用。这种机制与访问结构字段完全不同。

    调试器基本上可以显示结构中的任何字段,因为它不需要任何特殊知识并且不会产生任何后果。只需要结构定义。另一方面,获取 Objective-C 属性的值需要在进程上下文中执行代码。您可以在调试器控制台中手动执行此操作,但调试器不会自动执行此操作。

    我认为这在理论上仍然是可能的在孤立的情况下,但非常困难。考虑执行访问器方法更改对象的内部状态的情况。例如,调用-[UIViewController view](访问其view 属性)会导致加载视图。也可能调用委托方法等。在这种情况下,将鼠标悬停在 IDE 中的属性上会改变进程的执行状态,从而使调试本身成为笑话。

    【讨论】:

    • 我知道该属性是语法糖,但我没有得出你指出的结论。感谢您清理它。至少我不会一直寻找不存在的东西。在相关的说明中,您通常如何发现由属性包装的名称?例如,我只是偶然发现 _tag 是属性标签包装的基础变量。我不想假设我可能正在寻找的只是一个前置下划线,那么有没有一种简单的方法来发现这个?我检查了文档并没有看到任何内容。
    • 一般来说,属性和 ivar 之间没有关联,因为属性可能是“动态的”,即返回动态计算的值。我从不查看 ivar 值,除非它是我的班级并且我知道谁是谁。例如,一些 Apple 的类包含已弃用的 ivars、没有明显目的的 ivars、混淆甚至隐藏的 ivars(通常是私有类的对象)。一般来说,在调试时,专注于您自己的代码的行为是有意义的,即您可以无限制访问的代码。
    • 我明白了,所以如果我正在跟踪 UIView.tag 之类的东西(来自另一个类的东西),我唯一真正的选择是,如果调试与这种“黑盒”属性相关的问题是在输出窗口中手动打印?
    • 是的。这很痛苦,我知道。在这种情况下,我经常使用NSLog()。顺便说一句,调试器控制台中的po aView 也会打印出aView 的标记(如果已设置)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多