2

わかりました、私は初めてではありませんObjective-Cが、今まで見たことのない奇妙なバグに遭遇しました。多分私は小さな間違いを犯しただけで、あなたはそれを見ることができます.

私の関数の 1 つで、次の方法でカスタム ビュークラスから新しいオブジェクトを作成することから始めます。

[buttonsBackground removeFromSuperview];
self.buttonsBackground = [[[PostCommentButtonsBackground alloc] initWithFrame:self.contentView.bounds] autorelease];
buttonsBackground.delegate = self;

buttonsBackgroundしかし、デバッガーでこのブロックを飛び越えると、デバッガーはそれが nil-pointer であると主張します。しかし、NSLog後で権利を追加する

NSLog(@"%@",self.buttonsBackground);

まだ行を印刷します

<PostCommentButtonsBackground: 0x7bd27a0; frame = (0 0; 320 82); layer = <CALayer: 0x6e688b0>>

これは明らかに、nil にはなり得ないことを意味します。これがどのように可能になるのか、誰にも考えがありますか?

GDB ではなく、LLDB デバッガーを使用しています。プロパティbuttonsBackgroundは次のように宣言されます

@property(nonatomic, retain)PostCommentButtonsBackground *buttonsBackground;

そのため、保持の欠落も当てはまりません。

編集:わかりました、まったく同じ問題を抱えているのは私だけではないことがわかりました。同じ問題を抱えている別の人がいます。

とにかく、この投稿を開いたままにしておきます。他の投稿で、開発者がメモリ管理で悪い仕事をしたと主張し続けたからです。私の投稿では、実際にはそうではないことがわかります。

4

1 に答える 1

3

新しい Xcode 4.3 を使用した LLDB は完全に失われることがあります。LLDB の代わりに NSLog を使用すると、初期化されたオブジェクトが正しく初期化され、nil.

したがって、バグの前にいるとき、これは本当に苦痛です。

于 2012-03-03T14:43:50.013 に答える