removeObserver是否存在任何角落案例行爲:name:object:?在下面的代碼塊,我的觀察沒有被正確註冊:NSNotificationCenter刪除錯誤的觀察者?
- (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上。
我沒有看到任何會改變iOS 5和iOS 6之間行爲的東西。但是,如果舊的'playerItem'爲'nil',我會發現舊版本的代碼以及可能的新版本會被破壞。或等於新的'playerItem'。 –
Gah!感謝您指出了這一點。 –