16

以前にオブザーバーとして追加されたオブジェクトに対してremoveObserver:を明示的にNSNotificationCenterに送信する必要がありますか?ARCではremoveObserverを明示的に送信する必要がありますか?

私はちょっと混乱しており、正確な答えを見つけることができません。

Observerを明示的に削除する必要がある理由と、コンパイラがclass/applicationに暗黙的に置かない理由を含めて、私に詳細を教えてください。

答えて

13

観察されたクラスがオブザーバの割り付け解除されたインスタンスをすべて呼び出すことができない場合は、removeObserver:に電話する必要があります。

+2

なぜARCはこれを予防するのですか?それは置くように[...リリース];それはなぜですか?... removeObserver:...]/ –

+7

もちろん、NSNotificationCenterは誰が監視しているかを知っています。結局、通知を中継する必要があります。解放されたオブザーバーに通知が送信されないようにするために、弱参照をゼロにすることができたようです。しかし、私はデモをダブルチェックするだけで、removeObserver:をdeallocで呼び出さないとクラッシュします。 Dang。 – davehayden

+0

オブザーバーに弱い参照があるので、必要はありませんが、Appleが明示的にそれを必要としないと文書化しない限り、必要です。多分私たちが必要とする機能要求です。 –

5

オブザーバーを削除することは常に賢明です。 オブザーバを削除しないと、オブジェクトが割り当て解除された場合でもメッセージは送信されます。それは間違いなく深刻な問題につながる別のオブジェクトに付随することさえあります。

+0

iOS 9以上をターゲットにしている場合は必要ありません。 –

2

KVOと通知のために常にオブザーバーを削除する必要があります。

7

10.11以降のオブザーバーは、割り当て解除メソッドで登録を解除する必要はありません。

NSNotificationCenterとNSDistributedNotificationCenterは、もはや 割り振り解除可能な登録済みオブザーバーに通知を送信しません。 オブザーバがゼロ化 - 弱い参照として格納できる場合、 の基になるストレージはオブザーバをゼロ化弱参照として格納します。 また、オブジェクトを弱く格納できない場合( カスタム保持/解放メカニズムがあり、実行時にオブジェクトが弱く格納されないようにするため)、オブジェクトは 非weakゼロ参照として格納されます。これは、割当解除メソッドでオブザーバを登録解除する必要がないことを意味します。 [1]

+0

これをここに追加していただきありがとうございます。私はこのことに気づいていませんでした。 –

+1

SDKの使用が終了する時間が増えるほど、この回答は他の回答と比べてより正確になります。それは最後の答えとして記載されていることは残念です。 – otto

+1

これは明らかにiOS9でも当てはまりますが(iOS8ではなく) Ref:http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

関連する問題