1. ホーム
  2. objective-c

[解決済み] Objective-Cです。NSNotificationのオブザーバを削除するには?

2022-11-24 13:15:40

質問

オブジェクト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 の中で(もう一度)行うことを考えます。しかし、何よりもまず、適切なタイミング(これはあなたのユースケースによって決定されます)で行ってください。