Сообщение NSNotificationCenter, вызывающее исключение "EXC_BAD_ACCESS" - PullRequest
62 голосов
/ 14 апреля 2011

A UIViewController добавляет себя в центр по умолчанию:

[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(editFood)
 name:@"editFood"
 object:nil];

Затем UITableView делегат NSObject отправляет NSNotification:

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"editFood"
 object:self];

Во время выполнения он получает EXC_BAD_ACCESS исключение.

Выпускается ли где-нибудь defaultCenter?Та же концепция работает, когда я отправляю уведомление в UIViewController из UIViewController, но это не должно иметь значения, верно?

Ответы [ 2 ]

128 голосов
/ 14 апреля 2011

Один из ваших подписчиков был освобожден. Обязательно позвоните [[NSNotificationCenter defaultCenter] removeObserver:self] в свой диллок (если не раньше).

10 голосов
/ 13 октября 2014

EXC_BAD_ACCESS может произойти даже после проверки существования dealloc следующим образом:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self]
}

Вышесказанное решит проблему большую часть времени, но, очевидно, моя причина заключалась в том, что я косвенно добавил наблюдателя с selector:, установленным на nil, следующим образом:

[NSNotificationCenter.defaultCenter addObserver:self
                                         selector:nil
                                             name:notificationName
                                           object:nil];

... поэтому, когда я опубликовал что-то с этим notificationName, EXC_BAD_ACCESS произошло.

Решение было отправить селектор, который на самом деле указывает на что-то.

...