我正在尝试通过一些时髦的 UIView 行为进行调试,并且一直遇到 LLDB 绝对无用和误导的情况。让我告诉你我的意思:
NSLog(@"myView: %@", myView);
2012-04-20 15:24:57.070 myProj[35789:f803] myView: <MyView: 0x7cc7500; frame = (0 119; 768 885); layer = <CALayer: 0x7cc8030>>
但是当我在那一刻设置断点并尝试使用调试器时,它返回 nil:
(lldb) po myView
(MyView *) $552 = 0x00000000 <nil>
我会尝试转移到 GCC 4.2 看看它是否有帮助,但是在 LLVM GCC 4.2 下编译不是一个选项,因为这是一个 ARC 项目。
当然,如果我已经知道要查询的正确地址,LLDB 就可以工作。但是对于某些对象,符号名称和地址之间的链接似乎被破坏了,尽管它适用于大多数其他对象。
(lldb) po self
(MyViewController *const) $51 = 0x07e92200 <MyViewController: 0x7e92200>
(lldb) po myView
(MyView *) $25 = 0x00000000 <nil>
2012-04-20 15:44:17.250 myProject[37551:f803] myView: <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>
(lldb) po 0x7e8e240
(int) $50 = 132702784 <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>
我怎样才能解决这个问题?我什至尝试过 self->myView,但也没有用。
更新:(它变得更糟!)
我应该补充一点,在这个例子中 myView 是一个类变量,而不是一个属性(lldb 将它与 nil 相关联)。如果我将 myView 设为类属性并 @synthesize 它,lldb 将获得不正确但可预测的值,并且它将 myView 符号与 @synthesize 之前最近合成的属性相关联。所以就我而言,代码如下所示:
@synthesize myDate=myDate_;
@synthesize myView;
因此,当从 LLDB 评估 myView 的属性时,它会显示存储在 myDate_ 中的日期:
(lldb) po myView
(MyView *) $24 = 0x07ca0900 2008-01-08 05:00:00 +0000
在最后一种情况下,如果我将 myView 设为方法变量,LLDB 将是正确的:
(lldb) po myView
(UIView *) $7 = 0x07d81080 <MyView: 0x7d81080; frame = (0 119; 768 885); layer = <CALayer: 0x7d81b70>>
这听起来像是 LLDB 本身的一个非常明显的错误。
更新 2:
进一步研究:看起来所有的类属性都是错误的!列表中的第一个属性显示 LLDB 中的 nil 值,所有其他属性显示在它之前合成的值。
这可能是一个奇怪的配置错误吗?