2012-04-05 61 views
0

所以我在我正在使用的一些示例代码中使用了一些属性。值得注意的是UIView类的“标签”属性。现在我设置这个属性,如果我NSLog它,或者基于标签的值设置控制语句,我可以看到我设置的值在那里,并按照预期行事。XCode中的调试属性

但是,如果我将鼠标悬停在.tag上以查看哪个标记值存在,我从XCode中完全没有收到任何标记值。没有弹出显示值。因此,我去了汽车/本地/所有窗口,我尝试“添加表达式...”(似乎这是设置传统的“手表”变量的唯一方法,如果有其他方式,请让我知道)。无论如何,所以我把我的object.tag到“观察”窗口,它是空白的。没有价值。它不是零,它只是没有,就好像它不存在。

当然,如果我将鼠标悬停在“object.tag”的“对象”部分,然后我得到一个弹出对象与披露矩形,我展开,然后我去寻找“_tag”(这似乎是底层的实例变量)。

那么这有什么困难呢?为什么在调试过程中不能通过简单的悬停标签属性来查看标签属性?这是否与XCode开发中的属性有关?

PS - 我运行的是最新版本的Xcode:4.3.2

+0

我的意思是披露TRIangle,而不是矩形:) – Chris 2012-04-06 05:45:16

回答

1

tag财产,任何其他Objective-C的属性,是一个语法糖。实际上,属性是作为访问器方法实现的,而这些方法又被转换为函数调用。这个机器就像访问一个struct字段一样。

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

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

+0

我意识到该属性是语法糖,但我没有把它指出来。感谢您清理它。至少我不会继续寻找不存在的东西。 在相关说明中,您通常如何去发现物业包装的名称?例如,我只是偶然发现_tag是属性标记包装的基础变量。我讨厌假设我可能正在寻找的东西只有一个前置的下划线,那么是否有一种简单的方法来发现它?我查看文档并没有看到任何内容。 – Chris 2012-04-06 05:46:58

+0

一般来说,财产和伊娃之间没有相关性,因为属性可能是“动态的”,即返回一个即时计算的值。我从来没有看过伊娃的价值观,除非是我的课,我知道谁是谁。例如,某些Apple类包含不推荐的ivars,没有明显目的的ivars,模糊甚至隐藏的ivars(通常是私有类的对象)。一般来说,在调试的时候,专注于你自己的code_行为是你无限制访问的代码是合理的。 – Costique 2012-04-06 06:30:07

+0

我明白了,那么如果我追踪像UIView这样的东西。标记(来自另一个类的东西)我唯一真正的选择,那么如果调试与这样的“黑匣子”属性有关的问题是在输出窗口中手动打印它? – Chris 2012-04-06 07:45:22