0

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 上。

4

3 回答 3

1

找到了答案。原来这与传入nil观察者姓名有关。呼叫将从观察 发布的任何通知[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:temp]; 中删除。但是,在 temp is 的极端情况下,这行代码将作为观察者一起删除。selftempnilself

于 2012-10-16T04:31:34.547 回答
0

名字不应该是零。你试过给你的观察者起个名字吗?

于 2012-10-10T01:56:35.293 回答
0

@Lee 是正确的,名称不应该是 nil,但也不应该是观察者的名字。相反,它应该是您正在注册观察的通知的名称。例如,UIDeviceOrientationDidChangeNotification。在该参数中添加您要观察的通知的名称,并在删除观察者时将其作为名称参数传递

于 2012-10-10T03:03:49.907 回答