0

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

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

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

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

我正在运行 Xcode 4.3.2

4

1 回答 1

1

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

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

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

于 2012-04-05T20:31:46.933 回答