iOS開發 UIViewController內存管理
iOS開發 UIViewController內存管理是本文要介紹的內容,在 iOS 3.0 后,UIViewController 多了一個叫做 viewDidUnLoad 的方法。不少人都不清楚這個方法的具體意義,蘋果的文檔也就一句 ”Called when the controller’s view is released from memory” 簡單的解釋了下,并要求你把 IBOutlet 綁定的視圖給清空,為什么呢?
先看下 UIViewController 從創建 view 到展示的流程的幾個函數
- -init
- -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 給創建起來。若沒將自己額外添加的子視圖,各種類實例變量釋放,這里便會重新再次創建。
于是,內存泄露了。
小結:詳解UIViewController 內存管理的內容介紹完了,希望本文對你有所幫助。
轉自 http://ixhan.com/2011/02/uiviewcontroller-memory-manage/