Объект в addObserver отличается

У меня есть следующий код:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillEnterFullscreen:)
                                             name:MPMoviePlayerWillEnterFullscreenNotification
                                           object:nil];

И метод использует свойство self:

- (void)moviePlayerWillEnterFullscreen:(NSNotification *)notification
{
    NSLog(@"%@", self.videoItem._id);
}

Иногда (не всегда) самообъект внутри обработчика является другим объектом (и неинициализированным, вызывающим сбой)

Я не могу понять, что я делаю неправильно, и как избежать этого случая. Это "self" объект копируется?

1 ответ

Решение

Повторяя комментарий @0x7fffffff, если вы регистрируете наблюдение, вы почти всегда хотите иметь:

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

Удаление (как правило) небольшая плата за удаление себя из центра уведомлений, и не имеет значения, являетесь ли вы наблюдателем или нет, поэтому я рекомендую эту хорошую страховку для любого объекта, который когда-либо наблюдал уведомление.

(Удаление себя в качестве наблюдателя составляет O(n) в общем количестве зарегистрированных наблюдений в центре. Так что, если у вас есть тысячи наблюдений за уведомлениями, тогда removeObserver: может занять нетривиальное время, но так будет postNotification:, В этом случае вам, как правило, следует уменьшить количество проведенных наблюдений, а не избегать их использования. removeObserver:.)

Следуя вашему комментарию, вы почти никогда не захотите использовать addObserver: в viewDidLoad, Вы почти всегда хотите сделать это в viewDidAppear: и удалить себя в качестве наблюдателя в viewWillDisappear: (или же viewWillAppear:/viewDidDisappear:в зависимости от того, что удобно), а также в dealloc как безопасность. Почти всегда неправильно наблюдать уведомления в контроллере представления, который в данный момент не отображается на экране.

Другие вопросы по тегам