正しい方法で通知を削除することについては、多くの議論があります。例えば:
viewWillDisappear
(またはviewDidDisappear
) およびviewDidUnload
ライフサイクル メソッドのオブザーバーを削除することをお勧めします。(注: viewDidUnload
非推奨であり、iOS6+ では実装すべきではありません。iOS 6 を参照してください - viewDidUnload migrate to didReceiveMemoryWarning? )
重要な注意:
viewDidUnload
が呼び出される保証はありません。これは標準的なライフサイクル メソッドではありません。
アップルのドキュメントから:
viewDidUnload メモリ不足の状態が発生し、現在のビュー コントローラーのビューが必要ない場合、システムはそれらのビューをメモリから削除することを選択する場合があります。このメソッドは、View Controller のビューが解放された後に呼び出され、最終的なクリーンアップを実行するチャンスです。
代わりに、dealloc
そのレシーバーの参照数がゼロになるたびに呼び出されます。
それが役に立てば幸い。
編集
完全を期すために、回避方法に関するこのリンクを参照できます-nsnotification-removeobserver。このリンクは、オブザーバーを削除するための便利なガイドラインを提供します (コメントも参照してください)。著者はviewDidAppear
/viewDidDisappear
メソッドでこれを行っており、多くのアプリケーションで常に正しく呼び出されるviewWillAppear
とは限りません。viewWillDisappear
それはあなたの選択です。
オブザーバーを正しい方法で確実に削除したい場合は、dealloc
メソッドで登録解除するか、2番目のコメントで書いたようにビューが完全にアンロードされたときに登録を解除してください。しかし、それdealloc
が将来的に呼び出されることを確認してください。つまり、既に述べたように、他のオブジェクトが参照しているためにコントローラーが存続し続けると、メソッドが呼び出されることはありません。この場合、コントローラは引き続き通知を受け取ります。