3

に/からオブザーバーを追加および削除するためのベストプラクティスは何NSNotificationCenterですか?

selfオブザーバーとして追加してviewDidLoad削除selfするviewDidUnloadだけで十分かどうか疑問に思っています。または、おそらく私も削除する必要selfdeallocあります。

おそらく、メモリ不足の状態を考慮する必要があります。viewDidLoad追加と削除deallocが問題であることがわかりました:viewDidUnloadメモリ不足のために呼び出されます...viewDidLoadビューが再度表示されたときに呼び出されます...self削除されずにオブザーバーとして2回追加されました(そうでdeallocはなかったので)と呼ばれる)。

:サブクラスselfを参照する基本的な例を考えています。UIViewController

4

2 に答える 2

8

iOS 9 以降および OS X 10.11 以降については、WWDC 2015 セッション 202「ココアの新機能」で次のことが発表されました。

NSNotificationCenter
割り当て解除されたオブザーバーは自動的に登録解除されます

let center = NSNotificationCenter.defaultCenter()
center.addObserver(self,
                   selector: "localeChanged:",
                   name: NSCurrentLocaleDidChangeNotification,
                   object: nil)

電話する必要はありません

let center = NSNotificationCenter.defaultCenter()
center.removeObserver(self,
                      name: NSCurrentLocaleDidChangeNotification,
                      object: nil)

参照: 33:27 のビデオ、pdf スライド 241

于 2015-10-17T07:53:56.550 に答える
8

私は通常、UIViewControllerオブザーバーの登録viewWillAppearと削除を で行いviewWillDisappearます。

viewWillDisappearviewWillUnload後者のメソッドは、iOS バージョン5.0 よりも古いメモリ不足の状況でのみ呼び出されるため、より安全な選択のように思えます。

おそらく、最も適切な答えは、View Controller が何をしているかによって異なります。ビューが表示される前に、通知を受け取ることを期待していますか (そしてそれに対応する必要がありますか?) もしそうなら、オブザーバーを追加するviewDidLoadことはあなたにとって正しいことかもしれません。

于 2012-01-01T16:49:14.153 に答える