我需要在我的UIViewController
中加載一些數據,以在iPhone模式視圖中顯示UIPickerView
小部件。在UIViewController中加載和卸載數據
我做了一些研究,發現在SO中有這個answer。我繼續執行我的數據讀取代碼initWithNibName:bundle:
和數據卸載dealloc
。然而,儀器不停地告訴我在重複顯示模態視圖時存在內存泄漏,並且在調試期間,我注意到每次顯示視圖時都會調用initWithNibName:bundle:
,但在正常執行過程中從不會調用dealloc(儘管它是由低內存條件按照蘋果公司的UIViewController Class Reference文件,同樣適用於viewDidUnload
)。
我結束了在viewDidLoad:
方法中加載數據,並且我在viewDidDisappear:
中發佈了它,窗口小部件顯示數據並且沒有泄漏。不過,我想知道是否有關於這個任何好的做法,因爲對蘋果的文檔中的一個評論提到了這一點:
你不應該使用這種方法(即viewDidUnload)發佈的用戶數據或任何其他無法輕易重新創建的信息。
我假定正確的方式是在viewDidLoad中負載數據和釋放在viewDidUnload給它的所有參考文獻,但是在實踐中,後一種方法是不叫,除非低存儲器狀態出現,因此每個時間被顯示在視圖,數據再次加載並且對舊數據的引用丟失,導致內存泄漏。
感謝您的意見。
是的,當我看到'initWithNibName:bundle:'在每次顯示視圖時都會被調用,但我使用一個簡單的UIViewController,我不認爲實現'UIPickerViewDelegate'和' UIPickerViewDataSource協議會改變正常的行爲。我的項目的基礎SDK是**最新iOS(iOS 5.0)**。 – rtovars 2012-02-24 00:34:56
好吧,假設你正在爲每個模態演示文稿創建一個新的視圖控制器,是的,你會爲每一個獲得一個'loadView'。如果你覆蓋,然後發現該視圖,你不應該得到'loadView'。另一方面,每當你減弱模態時,你應該得到一個'deallo'c。如果你不這樣做,這意味着你有一個或多個流浪的「保留」。 – smparkes 2012-02-24 00:52:42
哦,你說的對,我爲每一個模態演示創建一個新的視圖控制器。但是,當我解散模態視圖時,不會調用'dealloc'。我會再次檢查保留。謝謝! – rtovars 2012-02-24 01:34:24