Лучшие практики для добавления / удаления наблюдателей в / из NSNotificationCenter - PullRequest
2 голосов
/ 01 января 2012

Как лучше всего добавлять и удалять наблюдателей в / из NSNotificationCenter?

Интересно, если добавить self в качестве наблюдателя в viewDidLoad и удалить self в viewDidUnload достаточно.Или, возможно, мне следует удалить также self в dealloc.

Возможно, необходимо учитывать малые условия памяти.Я мог видеть, что добавление в viewDidLoad и удаление в dealloc проблематично: viewDidUnload вызывается из-за нехватки памяти ... тогда viewDidLoad вызывается при повторном отображении представления ... теперь self былодобавлен в качестве наблюдателя дважды без удаления (поскольку dealloc не вызывался).

Примечание : я рассматриваю лишь базовый пример, где self относится кUIViewController подкласс.

Ответы [ 2 ]

8 голосов
/ 01 января 2012

Обычно мой UIViewController наблюдатель регистрируется в viewWillAppear, а удаление в viewWillDisappear.

viewWillDisappear кажется мне более безопасным выбором, чем viewWillUnload, поскольку последний метод получает тольковызывается в ситуациях нехватки памяти на версиях iOS старше чем 5.0.

Наиболее подходящий ответ, вероятно, зависит от того, что делает ваш контроллер представления.Ожидаете ли вы получать (и должны реагировать на) уведомления еще до того, как ваше представление отобразится?Если это так, возможно, добавление наблюдателя в viewDidLoad - это то, что вам нужно.

5 голосов
/ 17 октября 2015

Для 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

...