Общий ответ будет «как только вам больше не нужны уведомления». Это явно не удовлетворительный ответ.
Я бы рекомендовал добавить [notificationCenter removeObserver: self]
в метод dealloc
тех классов, которые вы намереваетесь использовать в качестве наблюдателей, поскольку это последний шанс полностью отменить регистрацию наблюдателя. Это, однако, защитит вас только от сбоев из-за уведомления центра о мертвых объектах. Он не может защитить ваш код от получения уведомлений, когда ваши объекты еще не находятся в состоянии, в котором они могут должным образом обрабатывать уведомления. Для этого ... См. Выше.
Редактировать (так как ответ, кажется, привлекает больше комментариев, чем я мог бы подумать) Все, что я пытаюсь сказать здесь: очень сложно дать общий совет относительно того, когда лучше удалить наблюдателя из центра уведомлений, потому что это зависит:
- В вашем случае использования (Какие уведомления наблюдаются? Когда они отправляются?)
- Реализация наблюдателя (Когда он готов к получению уведомлений? Когда он больше не готов?)
- Предполагаемое время жизни наблюдателя (привязано ли оно к какому-либо другому объекту, скажем, представлению или контроллеру представления?)
- ...
Итак, лучший общий совет, который я могу придумать: защитить ваше приложение. по крайней мере, с одной возможной неудачей, сделайте танец removeObserver:
в dealloc
, так как это последняя точка (в жизни объекта), где вы можете сделать это чисто. Это не означает, что «просто отложите удаление до вызова dealloc
, и все будет хорошо». Вместо этого удалите наблюдателя , как только объект больше не будет готов (или необходим) для получения уведомлений . Это точный момент. К сожалению, не зная ответов на любой из упомянутых выше вопросов, я даже не могу догадаться, когда наступит этот момент.
Вы всегда можете безопасно removeObserver:
объект несколько раз (и все, кроме самого первого вызова с данным наблюдателем, будут nops). Итак: подумайте о том, чтобы сделать это (снова) в dealloc
просто для уверенности, но в первую очередь: сделайте это в соответствующий момент (что определяется вашим вариантом использования).