1

我有以下代码:

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

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

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

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

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

4

1 回答 1

4

呼应@0x7fffffff 的评论,如果您注册观察,您几乎总是希望拥有:

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

将自己从通知中心移除(通常)几乎没有成本,而且它并不关心您是否是观察者,所以这是我建议任何观察到通知的对象的良好保险。

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

跟进您的评论,您几乎不想addObserver:viewDidLoad. 您几乎总是希望在(或/ ,以方便者为准)中viewDidAppear:作为观察者并移除自己,并作为安全措施。在当前不在屏幕上的视图控制器中观察通知几乎总是不正确的。viewWillDisappear:viewWillAppear:viewDidDisappear:dealloc

于 2015-02-12T20:26:33.640 回答