2010-07-07 65 views
5

可以先使用-removeObserver:,然後用-addObserver:調用同名嗎?或者是在-removeObserver:之前先有-addObserver:addobserver/removeobserver查詢

我試過它使用操作系統4.0,它似乎確定(沒有崩潰,警告......等)。

-(void) setObserver 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:OBSERVER_NAME object:nil]; 

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

的原因是爲了防止兩個觀察者與被調用兩次假設-setObserver方法,如果再次調用同一selectorName方法其內部-viewDidLoad,併發出了內存不足的警告。

另外,在-dealloc期間是否需要調用-removeObserver:

+0

+1好問題。 我不知道是否保存刪除之前未註冊的Observer,但我知道在釋放之前必須刪除觀察者。 對於您的情況,您也可以刪除viewDidUnload中的觀察者。這就是這個方法的作用:平衡在loadView和viewDidLoad中所做的所有調用。 – tonklon 2010-07-07 13:32:40

回答

3

如果你得到-selectorName被調用兩次,你的代碼可能會有其他問題。即使Cocoa會優雅地移除你尚未添加的觀察者,我也不會那麼做。

正如用戶tonklon在評論中所說,您應該刪除-viewDidUnload中的觀察者。至於你的最後一個問題,移除-dealloc中的觀察者也是合理的,儘管最好的做法是構造你的代碼,以便像刪除觀察者那樣的事情在確定的時間發生,而不是作爲內存管理的副作用。