addObserver中的对象是不同的

时间:2015-02-12 20:05:36

标签: ios nsnotificationcenter addobserver

我有以下代码:

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

该方法使用self的属性:

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

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

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

1 个答案:

答案 0 :(得分:4)

回应@ 0x7fffffff的评论,如果你注册观察,你几乎总是想要:

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

从通知中心移除自己(通常)成本很低,并且不管你是否是观察者,所以这对于任何观察过通知的对象都是一个很好的保险。

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

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