addObserver 中的对象不同

object in addObserver is different

我有以下代码:

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

并且该方法使用了一个 属性 of self:

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

有时(不总是)处理程序中的 self 对象是不同的对象(并且是导致崩溃的未初始化对象)

我似乎无法弄清楚我做错了什么,以及如何避免这种情况。 "self" 对象是否被复制?

呼应@0x7fffffff 的评论,如果你记录一个观察,你几乎总是想要:

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

将您自己从通知中心移除(通常)成本很小,而且它不在乎您是否是观察者,因此我向任何曾经观察过通知的对象推荐这是一个很好的保险。

(将自己作为观察者移除是中心注册观察总数的 O(n)。因此,如果您有数千个通知观察,那么 removeObserver: 可能会花费大量时间,但也会如此postNotification:。在这种情况下,您通常应该减少观察次数,而不是避免使用 removeObserver:。)

根据您的评论,您几乎不想在 viewDidLoad 中使用 addObserver:。您几乎总是想在 viewDidAppear: 中执行此操作,并在 viewWillDisappear:(或 viewWillAppear:/viewDidDisappear:,以方便者为准)中删除自己作为观察者的身份,并且在 dealloc 作为安全。在当前不在屏幕上的视图控制器中观察通知几乎总是不正确的。