4

私のアプリケーションでは、キーボード通知をリッスンします。

  [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

アプリのクラッシュの原因となったバグを削除しました。

UI を備えたモーダル ビューがあります (表示されるたびに破棄され、再作成されます。

このコード行を追加する前に、2回目に使用したときにクラッシュしました。

[[NSNotificationCenter defaultCenter] removeObserver:self];

割り当て解除されたオブジェクトのオブザーバーを削除しないとクラッシュが発生する理由を知っている人はいますか?

4

3 に答える 3

3

これは、通知を受け取ったときにクラスをオブザーバーとして削除していない場合でも、メソッドを呼び出そうとするためです。ただし、オブジェクトは完全に割り当て解除されて破棄されているため、EXC_BAD_ACCESS が返されます。

于 2013-08-09T21:21:44.277 に答える
1

クラスの dealloc メソッドでオブザーバーを削除することをお勧めします。そうしないと、存在しないオブジェクトに通知が送信され、クラッシュします。

于 2013-08-09T21:21:33.230 に答える
1

NSNotificationCenter解放されているかどうかに関係なく、オブジェクトへの参照を維持します。NSNotificationCenter は古い UIViewController が完全に解放されたことを認識していないため、2 回目のクラッシュが発生します。

于 2013-08-09T21:22:19.250 に答える