2012-01-01 86 views
2

將觀察者添加到NSNotificationCenter或從中刪除觀察者的最佳做法是什麼?向NSNotificationCenter中添加/刪除觀察者的最佳做法

我想知道如果在viewDidLoad添加self作爲觀察員和viewDidUnload消除self就足夠了。或者也許我應該刪除selfdealloc以及。

可能需要考慮低內存條件。我可以看到在viewDidLoad中添加和刪除在dealloc有問題:viewDidUnload由於內存不足而被調用...然後在視圖再次顯示時調用viewDidLoad ...現在self已作爲觀察者添加兩次而不被刪除(因爲沒有調用dealloc)。

注意:我正在考慮一個基本的例子,其中self是指UIViewController子類。

回答

8

我通常做我的UIViewController觀察員註冊viewWillAppear和我在viewWillDisappear刪除。

viewWillDisappear似乎是因爲後一種方法更安全的選擇對我來說比viewWillUnload只被稱爲低內存情況下在iOS版本年長比5.0。

最合適的答案可能取決於您的視圖控制器正在做什麼。你希望在你的視圖顯示之前得到(並且需要做出反應)通知?如果是這樣,也許在viewDidLoad中添加觀察者對你來說是正確的。

+0

有趣。所以在iOS 5+中,在低內存條件下調用viewDidUnload來取代什麼呢? – SundayMonday 2012-01-01 19:07:44

+1

'didReceiveMemoryWarning'繼續​​在低內存條件下被調用。另外,請查看蘋果的[UIViewController](http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html)(具體來說就是那裏的「內存管理」部分):當發生低內存警告,如果UIViewController類知道它可以重新加載或稍後重新創建它們,則清除它的視圖。如果發生這種情況,它還會調用viewDidUnload方法,以使您的代碼有機會放棄與視圖層次關聯的任何對象的所有權。 – 2012-01-01 19:12:10

5

對於iOS 9+和OS X 10.11+的WWDC 2015 session 202 "What's New in Cocoa"宣佈:

NSNotificationCenter
釋放觀察家自動註冊的

let center = NSNotificationCenter.defaultCenter() 
center.addObserver(self, 
        selector: "localeChanged:", 
        name: NSCurrentLocaleDidChangeNotification, 
        object: nil) 

不需要調用

let center = NSNotificationCenter.defaultCenter() 
center.removeObserver(self, 
         name: NSCurrentLocaleDidChangeNotification, 
         object: nil) 

請參閱:視頻在33:27,pdf幻燈片241

相關問題