2012-02-23 139 views
1

我需要在我的UIViewController中加載一些數據,以在iPhone模式視圖中顯示UIPickerView小部件。在UIViewController中加載和卸載數據

我做了一些研究,發現在SO中有這個answer。我繼續執行我的數據讀取代碼initWithNibName:bundle:和數據卸載dealloc。然而,儀器不停地告訴我在重複顯示模態視圖時存在內存泄漏,並且在調試期間,我注意到每次顯示視圖時都會調用initWithNibName:bundle:,但在正常執行過程中從不會調用dealloc(儘管它是由低內存條件按照蘋果公司的UIViewController Class Reference文件,同樣適用於viewDidUnload)。

我結束了在viewDidLoad:方法中加載數據,並且我在viewDidDisappear:中發佈了它,窗口小部件顯示數據並且沒有泄漏。不過,我想知道是否有關於這個任何好的做法,因爲對蘋果的文檔中的一個評論提到了這一點:

你不應該使用這種方法(即viewDidUnload)發佈的用戶數據或任何其他無法輕易重新創建的信息。

我假定正確的方式是在viewDidLoad中負載數據和釋放在viewDidUnload給它的所有參考文獻,但是在實踐中,後一種方法是不叫,除非低存儲器狀態出現,因此每個時間被顯示在視圖,數據再次加載並且對舊數據的引用丟失,導致內存泄漏。

感謝您的意見。

回答

1

如果每次顯示您的視圖時都會調用viewDidLoad,則會發生不好的事情。 viewDidAppear應該被調用,但viewDidLoad應該只在第一次需要視圖時調用,如果需要視圖並調用viewDidUnload

+0

是的,當我看到'initWithNibName:bundle:'在每次顯示視圖時都會被調用,但我使用一個簡單的UIViewController,我不認爲實現'UIPickerViewDelegate'和' UIPickerViewDataSource協議會改變正常的行爲。我的項目的基礎SDK是**最新iOS(iOS 5.0)**。 – rtovars 2012-02-24 00:34:56

+0

好吧,假設你正在爲每個模態演示文稿創建一個新的視圖控制器,是的,你會爲每一個獲得一個'loadView'。如果你覆蓋,然後發現該視圖,你不應該得到'loadView'。另一方面,每當你減弱模態時,你應該得到一個'deallo'c。如果你不這樣做,這意味着你有一個或多個流浪的「保留」。 – smparkes 2012-02-24 00:52:42

+0

哦,你說的對,我爲每一個模態演示創建一個新的視圖控制器。但是,當我解散模態視圖時,不會調用'dealloc'。我會再次檢查保留。謝謝! – rtovars 2012-02-24 01:34:24