[解決済み] Objective-Cです。NSNotificationのオブザーバを削除するには?
質問
オブジェクトCのクラスがあります。その中で、initメソッドを作成し、その中にNSNotificationを設定しました。
//Set up NSNotification
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getData)
name:@"Answer Submitted"
object:nil];
をどこに設定すればいいのでしょうか?
[[NSNotificationCenter defaultCenter] removeObserver:self]
を設定するのでしょうか?私は
UIViewController
の中に追加することができます。
viewDidUnload
メソッド では、客観的なcクラスを作成した場合、何をする必要があるのでしょうか?
どのように解決するのですか?
一般的な回答は、「通知が不要になったらすぐに」です。これは明らかに満足のいく答えではありません。
私は、次の呼び出しを追加することをお勧めします。
[notificationCenter removeObserver: self]
メソッドに
dealloc
これはオブザーバの登録をきれいに解除する最後のチャンスです。しかし、これは、通知センターが死んだオブジェクトを通知することによるクラッシュからあなたを守るだけです。オブジェクトが通知を適切に処理できる状態でないときに、通知を受け取ることからコードを保護することはできません。これには... 上記を参照してください。
Edit (この回答は思ったより多くのコメントを集めているようなので)ここで言いたいのは、いつ通知センターから監視者を削除するのが最善かについて一般的なアドバイスをするのは本当に難しい、なぜならそれは依存するからです。
- 使用事例 (どの通知を監視するか? いつ送信されるか?)
- オブザーバーの実装について (いつ通知を受け取る準備ができたか? いつ準備ができなくなったか?)
- オブザーバの寿命 (他のオブジェクト、例えばビューやビューコントローラと連携しているか?)
- ...
つまり、私が思いつく最高の一般的なアドバイスは、少なくとも1つの可能性のある障害からアプリを保護するために、次のようにします。
removeObserver:
の中で踊りましょう。
dealloc
でのダンスは、(オブジェクトの生涯において) 最後のポイントであり、そこできれいに行うことができるからです。これが意味するのは、次のようなことではありません: "削除を
dealloc
が呼び出されるまで削除を延期すれば、すべてうまくいくでしょう。その代わりに、オブザーバを削除して
オブジェクトが通知を受け取る準備ができていない(あるいは必要でない)場合、すぐに
. それがまさに正しい瞬間です。残念ながら、上記の質問の答えを知らないので、その瞬間がいつになるのか、推測することさえできません。
あなたはいつでも安全に
removeObserver:
オブジェクトを複数回呼び出すことができます (そして、与えられたオブザーバを使った最初の呼び出し以外はすべて nops になります)。だから:それを(再び)行うことを考えるのは
dealloc
の中で(もう一度)行うことを考えます。しかし、何よりもまず、適切なタイミング(これはあなたのユースケースによって決定されます)で行ってください。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] 現在の日付から7日分を差し引いた日数
-
[解決済み] NSObject +loadと+initialize - これらは何をするのですか?
-
[解決済み] このgdbの出力は何を意味しているのでしょうか?
-
[解決済み] Objective-CでSwift構造体を使用する方法
-
[解決済み] iOS - プログラムでUISwitchを設定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AVFoundation AVPlayerで動画をループさせる?
-
[解決済み] Objective-Cのクラス→文字列のようなものです。[NSArray className] -> @"NSArray" のようになります。
-
[解決済み] Objective-CでNSArrayを新しいNSArrayにフィルタリングする。
-
[解決済み] カレントスレッドがメインスレッドであるかどうかをチェックする
-
[解決済み] Swiftでクラスをプロトコルに準拠させるには?
-
[解決済み] NSLog オーバーライドされた記述方法でのオブジェクトのメモリアドレスの記録
-
[解決済み] キーチェーンのアイテムは何がユニークなのか(iOSの場合)?
-
[解決済み] 警告 "format が文字列リテラルでなく、format の引数がない場合"
-
[解決済み] UIButtonsの背景色を変更することはできますか?
-
[解決済み] AppDelegateからストーリーボード上の異なる場所で条件付きで開始する。