Сообщение NSNotificationCenter, вызывающее исключение "EXC_BAD_ACCESS"

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

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

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

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

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

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

Ответ 1

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

Ответ 2

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.

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