ファンキーな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に移行して、それが役立つかどうかを確認しますが、これはARCプロジェクトであるため、LLVMGCC4.2でコンパイルすることはできません。
もちろん、クエリする正しいアドレスがすでにわかっている場合は、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は正しくないが予測可能な値を取得し、@synthesizeの前にmyViewシンボルを最後に合成されたプロパティに関連付けます。したがって、私の場合、コードは次のようになります。
@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の値を示し、他のすべてのプロパティはその直前に合成されたプロパティの値を示します。
これは奇妙な設定エラーでしょうか?