Добавление наблюдателя в NSNotificationCenter во второй раз вызывает EXC_BAD_ACCESS

Гипотетический сценарий:

В моем методе viewDidLoad я добавляю контроллер представления в качестве наблюдателя для пользовательского уведомления (скажем, уведомления MyFooNotification). Позже в процессе, когда представление загружено, уведомление публикуется, и контроллер обрабатывает его. Когда я оставляю контроллер с его представлением, я НЕ удаляю наблюдателя (намеренно) в viewDidUnload. В следующий раз при открытии представления наблюдатель снова добавляется, но теперь, когда публикуется наблюдаемое уведомление, я получаю EXC_BAD_ACCESS.

Может ли кто-нибудь объяснить, почему это происходит.

P.S. Я знаю, что должен удалить его в viewDidUnload. Мне просто любопытны детали более низкого уровня.


person Eimantas    schedule 25.03.2011    source источник
comment
Похоже, выпускается что-то, чего быть не должно.   -  person Nick Moore    schedule 25.03.2011


Ответы (1)


Скорее всего, из-за того, что исходный контроллер представления был освобожден из-за того, что он был извлечен из стека навигации (или аналогичного), но NSNotificationCenter все еще имеет ссылку на него. Таким образом, когда уведомление отправляется снова, NSNotificationCenter пытается уведомить освобожденный теперь контроллер представления и в результате получает EXC_BAD_ACCESS.

Если вы когда-нибудь добавили объект в NSNotificationCenter в качестве наблюдателя, вы должны удалить его во время dealloc.

person freespace    schedule 25.03.2011