Объект в 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
как безопасность. Почти всегда неправильно наблюдать уведомления в контроллере представления, который в данный момент не отображается на экране.