ios - NSNotificationCenter 删除错误的观察者?

标签 ios nsnotificationcenter nsnotifications

removeObserver:name:object: 是否有任何极端情况行为?在以下代码块中,我的观察者未正确注册:

- (void)setPlayerItem:(AVPlayerItem *)playerItem {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:nil
                                               object:playerItem];

    [playerItem addObserver:self
                 forKeyPath:kStatus
                    options:0
                    context:(__bridge void*)self];

    [playerItem addObserver:self
                 forKeyPath:kPlaybackBufferEmpty
                    options:0
                    context:(__bridge void*)self]; // For adding a buffering activity indicator

    id temp = playerItem_;
    playerItem_ = [playerItem retain];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:temp];
    [temp removeObserver:self forKeyPath:kPlaybackBufferEmpty];
    [temp removeObserver:self forKeyPath:kStatus];
    [temp release];
}

但是,如果我将顺序更改为:

- (void)setPlayerItem:(AVPlayerItem *)playerItem {    
    [playerItem addObserver:self
                 forKeyPath:kStatus
                    options:0
                    context:(__bridge void*)self];

    [playerItem addObserver:self
                 forKeyPath:kPlaybackBufferEmpty
                    options:0
                    context:(__bridge void*)self]; // For adding a buffering activity indicator

    id temp = playerItem_;
    playerItem_ = [playerItem retain];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:temp];
    [temp removeObserver:self forKeyPath:kPlaybackBufferEmpty];
    [temp removeObserver:self forKeyPath:kStatus];
    [temp release];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:nil
                                               object:playerItem];
}

所有通知都发布得很好。这让我相信当我打电话时发生了奇怪的事情:

    [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:temp];

我在这里遗漏了一些非常明显的东西吗?我使用的是没有 ARC 的 iOS 6。

最佳答案

找到答案了。事实证明,这与传入观察者名称的 nil 有关。 调用[[NSNotificationCenter defaultCenter]removeObserver:self name:nil object:temp]; 将使 self 不再观察 temp 发布的任何通知。 然而,在 temp 为 nil 的极端情况下,这行代码将把 self 作为观察者全部删除。

关于ios - NSNotificationCenter 删除错误的观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810867/

相关文章:

objective-c - 使用 Grand Central Dispatch 时如何发布 NSNotification?

ios - 没有 iPhone 的 Apple Watch 上的 HealthKit 数据存储?

ios - UITextView becomeFirstResponder 使用 iOS SDK 8.2 失败

ios - 通知中心在模拟器上导致 EXC_BAD_ACCESS 的原因是什么,但在设备上却没有?

ios - Swift 中的 NSNotificationCenter 行为不正确(只调用函数中的某些东西)

ios - 电影播放器​​控件可见/隐藏时的通知?

ios - 如何在iOS中正确处理 View Controller 中的数据持久性和状态警报

ios - 加密8字节字符串/base64编码/最大长度20字节

ios - 基于 block 的 NSNotificationCenter 观察子类?

cocoa - 使用 NSRect 信息发布 NSNotification 的最佳方式?