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/