2016-09-23 8 views
4

iOS 9のthis投稿を読んだ後、もうObserverを削除する必要はないことがわかりました。なぜios8でオブザーバーを削除する必要がありますか?

しかしiOSの8のために、あなたneededのViewControllerのdeinit方法でremoveObserverへ。 しかし、私はそれを理解できません。 viewControllerが割り当て解除された場合、DEADは解放されていませんか? removeObserverを実行する必要があるのはなぜですか。それはオブザーバーであり、決して電話を拾わない死んだ人を呼ぶようなものです。

私は何を理解していませんか?それは完全にあなたがリンク先の記事で説明しています

+3

解約されたインスタンスにメッセージを送信するとアプリがクラッシュするため... –

答えて

9

通知センターは現在、観察者にゼロの参照を保持します:

観察者がゼロ化、弱い参照として保存することができる場合オブジェクトを弱く格納できない場合(つまり、ランタイムがオブジェクトを弱く格納できないようにするカスタムの保持/解放メカニズムがある場合)、オブジェクトは次のように格納されます。非弱ゼロ設定参照。

NSNotificationCenterは、ターゲットが割り当て解除されていた知らなかったので、iOSの9、NSNotificationCenterに先立ってweak参照を使用して実装されていませんでした。登録されたターゲットには盲目的に通知が送信されました。ターゲットが割り当て解除された場合、これは悪い(クラッシュする可能性があります)。したがって、常に登録を解除する必要があります。

iOS 9では、NSNotificationCenterは弱い参照を使用して開始されました。つまり、登録されたターゲットの1つが割り当て解除されたかどうかを知ることができます。つまり、割り当てられていないターゲットに通知を送信しようとしなくなりました。そして、これは、割り当てを解除する前にターゲットを明示的に登録解除する必要がなくなったことを意味します。

4

それは観測者であることは、あまり正確

を携帯電話を拾うことはありません死んだ人を呼ぶようなものです!

この場合の電話番号はメモリアドレスで、通知センターがオブザーバに電話をかけようとすると逆参照されます。 View Controllerの割り当てが解除されたら、このメモリアドレスにはどのようなことがありますか?私たちは知ることができません。

しかし、もう存在しないオブジェクトや完全に異なるもの(イメージなど)に置き換えられたオブジェクトでも、(通知センターが行う)メソッドを呼びたくはありません。

実世界の例を追加する:車(ビューコントローラ)がガレージの特定の場所(メモリアドレス)にあるように頼ります。あなたは絶対にそこにいるためにあなたの車に頼っているので、あなたが入ってみたいときにそれがあるかどうか見ていない。今、誰かがあなたの車を取り除いた(見落とした)ようだが、あなたはまだそれに頼っている。それはもはやそこにいない車に乗り込んで座るのは間違いなく痛い経験です。

関連する問題