1

私はいくつかの Objective-C コードを扱っていて、疑問に思っていました.NSNotificationCenter について学んでいるときに、dealloc で NSNotificationCenter オブザーバーを削除するのが一般的に良い方法であることに気付きました。ただし、自動解放プールを使用する場合、これは処理されますか、それとも dealloc メソッドが必要ですか?

- (void) dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:XBPageCurlViewDidSnapToPointNotification object:nil];
}

前もって感謝します!

4

3 に答える 3

3

何があっても、そのクラス インスタンスの有効期間内に追加されたオブザーバーを削除する必要があります。

問題の通知がトリガーされると、インスタンスの呼び出しが試行されます。そのインスタンスが無効になった場合 (割り当て解除などにより)、アプリはクラッシュします。

経験則として、UIKit 自体は ARC を使用しないため (通常は例外あり)、弱参照には従いません。

于 2013-03-15T03:20:08.603 に答える
1

NSNotificationCenter が弱い参照をサポートしているとは思えません。代わりに unsafe_unretained 参照を使用するため、 でクリーンアップしないと、ダングリング ポインターになる可能性がありますdealloc

于 2013-03-15T03:23:08.183 に答える
1

いずれの場合も、オブザーバーの削除に注意する必要があります。
自動解放プールは、プールが解放されるまでオブジェクトを保持するだけで、プールが解放されると解放メッセージが各オブジェクトに送信され、そのオブジェクトの保持カウントがゼロになると割り当てが解除されます。割り当てを解除する前に、そのdeallocメソッドが呼び出されます。
PSdealloc自動解放プールは、メソッド内で何が起こっているかを気にしません。

于 2013-03-15T03:23:18.043 に答える