запрос addobserver / removeobserver - PullRequest
5 голосов
/ 07 июля 2010

Можно ли сначала использовать -removeObserver:, а затем вызвать -addObserver: с тем же именем?Или это правило - сначала иметь -addObserver: до -removeObserver:?

Я пробовал использовать ОС 4.0, и, похоже, все в порядке (без сбоев, предупреждений ... и т. Д.).

-(void) setObserver
{
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:OBSERVER_NAME object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector: @selector(selectorName)
                                             name:OBSERVER_NAME 
                                           object:nil]; 
}

Причина состоит в том, чтобы не допустить повторного вызова двух наблюдателей с одним и тем же методом selectorName, при условии, что метод -setObserver был вызван снова, если он находится внутри -viewDidLoad и было выдано предупреждение о памяти.

Кроме того, мне нужно вызвать -removeObserver: во время -dealloc?

1 Ответ

3 голосов
/ 22 ноября 2010

Если вы дважды вызываете -selectorName, возможно, существует другая проблема с вашим кодом.И даже если Cocoa изящно удалит наблюдателей, которых вы еще не добавили, я бы на самом деле этого не сделал.

Как говорит пользователь tonklon в комментарии, вам, вероятно, следует удалить наблюдателя в -viewDidUnload.Что касается вашего последнего вопроса, также разумно удалить наблюдателя в -dealloc, хотя это хорошая практика, чтобы структурировать ваш код так, чтобы такие вещи, как удаление наблюдателей, происходили в детерминированное время, а не как побочный эффект управления памятью.

...