2

Какова наилучшая практика для добавления и удаления наблюдателей в/из NSNotificationCenter?Лучшая практика для добавления/удаления наблюдателей в/из NSNotificationCenter

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

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

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

ответ

8

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

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

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

+0

Интересно. Итак, в iOS 5+ то, что вызывается вместо viewDidUnload в условиях низкой памяти? – SundayMonday

+1

'didReceiveMemoryWarning' продолжает вызываться в случае низких условий памяти. Кроме того, ознакомьтесь с [UIViewController] Apple (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html) (в частности, раздел «Управление памятью»): Когда появляется предупреждение с низкой памятью, класс UIViewController очищает свои представления, если он знает, что он может перезагрузить или воссоздать их позже. Если это произойдет, он также вызывает метод viewDidUnload, чтобы дать вашему коду возможность отказаться от владения любыми объектами, связанными с вашей иерархией представлений. –

5

Для прошивкой 9+ и OS X 10.11+, то WWDC 2015 session 202 "What's New in Cocoa" объявил:

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

Смежные вопросы