iOS開發UIViewController內存管理是本文要介紹的內容,在 iOS 3.0 後,UIViewController 多了一個叫做 viewDidUnLoad 的方法。不少人都不清楚這個方法的具體意義,蘋果的文檔也就一句 ”Called when the controller’s view is released from memory” 簡單的解釋了下,並要求你把 IBOutlet 綁定的視圖給清空,為什麼呢?
先看下 UIViewController 從創建 view 到展示的流程的幾個函數
-initWithNibName:bundle:
這個方法是初始化一個 vc,但請注意 view 不是這時候載入的
-loadView
-viewDidLoad
當一個視圖准備展現時,vc 首先會判斷 view 是否已經創建否則便通過之前指定的 xib 文件來初始化 view,以及綁定其他關系(若沒有指定 xib 文件,則默認會搜索和 vc 同名的 xib,比如 myNameViewController 就會搜索 myNameViewController.xib 文件)
若是沒有 xib 文件,你就可以在 loadview 中自己手動創建這個 viewControoler 需要的視圖。接下來就是調用到 -viewDidLoad,許多人喜歡在這裡做些其他事情,比如做個 http 請求、建立個數組啥的。這裡若不處理正確,-viewDidUnload 激活時內存就容易洩露了,稍後提到。
-view()appear
-view()disappear
這幾個方法就不解釋了
-viewDidUnload
該方法在收到內存警告,同時該視圖並不在當前界面顯示時候會被調用,此時該 controller 的 view 已經被釋放並賦值為 nil。
接下來你要做的是把實例變量的子視圖釋放(IBOulet 的,以及自己添加的) 其他實例變量,比如之前在 -viewDidLoaded 中實例的數據數組、http 請求釋放掉
因為當該 viewController 再次被激活准備顯示時(比如 navigationControler 返回到上一級),vc 發現自己的 view 為空後會重復之前的流程直到把 view 給創建起來。若沒將自己額外添加的子視圖、各種實例變量釋放,這裡便會重新再次創建,於是,內存洩露了。
在mac os 中,如果控件使用IBOutlet連接,而無@property(retain)屬性,則在dealloc不需要release; 如果有retai屬性,則需要release。