2012-10-10 80 views
0

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

+0

我沒有看到任何會改變iOS 5和iOS 6之間行爲的東西。但是,如果舊的'playerItem'爲'nil',我會發現舊版本的代碼以及可能的新版本會被破壞。或等於新的'playerItem'。 –

+0

Gah!感謝您指出了這一點。 –

回答

1

找到答案。事實證明,這與觀察員姓名傳入nil有關。 調用[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:temp]; 將從觀察temp發佈的任何通知中刪除self。 但是,在臨時情況下,溫度爲nil,這行代碼將作爲觀察者一起刪除self

0

名稱不應爲零。你有沒有嘗試給你的觀察員一個名字?

0

@Lee是正確的名字不應該是零,但它也不應該是觀察員的名字。相反,它應該是您註冊要觀察的通知的名稱。例如,UIDeviceOrientationDidChangeNotification。 添加您要在該參數中觀察的通知的名稱,並在刪除觀察者時將其作爲名稱參數傳遞給您

+0

這不應該是一個問題。根據文檔,如果通知名稱爲零,則意味着通知中心將向觀察者發送由所觀察對象發佈的所有通知。與刪除觀察者一樣。傳遞nil將從觀察對象發佈的所有通知中刪除觀察者。 –

+0

您確定要從觀察者中刪除觀察者的對象與您作爲觀察者添加的同一對象相同嗎? – geraldWilliam

+0

Thx爲澄清順便說一句,我不知道 – geraldWilliam

相關問題