回答

13

是的,你需要調用removeObserver:,如果你沒有觀察到的類可以調用觀察者的所有deallocated實例。

+2

那麼爲什麼不採取預防措施呢?喜歡它放[...釋放];爲什麼它不放[:removeObserver:...]?/ –

+7

當然,NSNotificationCenter知道誰在觀察:畢竟,它必須中繼通知。看起來他們可以使用調零弱引用來確保通知不會被髮送給釋放的觀察者。但是我做了一個快速演示,以便仔細檢查,如果不調用removeObserver:dealloc,它會崩潰。蕩。 – davehayden

+0

它不需要是必要的,因爲對觀察者可能有一個弱引用,但除非Apple明確證明它不是必需的,否則它是必需的。也許我們需要製作一個功能請求。 –

5

刪除觀察者總是一個聰明的想法。 如果您不刪除觀察者,即使對象已被釋放,消息仍將被髮送。它甚至可能被附加到另一個對象上,這肯定會導致嚴重的麻煩。

+0

如果您的目標是iOS 9或更高版本,那麼幾乎每個人都會前進,這不是必需的。 –

2

您總是需要刪除KVO的觀察者以及通知。

7

從10.11開始,觀察者不需要在其取消分配方法中註銷。

NSNotificationCenter和NSDistributedNotificationCenter不再 通知發送到可以釋放登記的觀察員。如果 觀察者能夠被存儲爲一個歸零弱參考,則底層存儲將該觀察者存儲爲一個歸零弱參考。 或者,如果對象不能被弱存儲(因爲它有一個 自定義保留/釋放機制,可能會阻止運行庫從弱點存儲對象 )該對象存儲爲一個非弱的清零引用 。這意味着觀察員不需要 以取消分配方法取消註冊。 [1]

+0

謝謝Parag,在這裏添加這個。即使我沒有意識到這一點。 –

+1

隨着時間的推移以及更老的SDK不再使用,與其他答案相比,這個答案變得越正確。它被列爲最後一個答案是一個恥辱。 – otto

+1

這對iOS9顯然是(但不是iOS8)。 Ref:http://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/ –

相關問題