iOS開發(fā) UIViewController內(nèi)存管理
iOS開發(fā) UIViewController內(nèi)存管理是本文要介紹的內(nèi)容,在 iOS 3.0 后,UIViewController 多了一個叫做 viewDidUnLoad 的方法。不少人都不清楚這個方法的具體意義,蘋果的文檔也就一句 ”Called when the controller’s view is released from memory” 簡單的解釋了下,并要求你把 IBOutlet 綁定的視圖給清空,為什么呢?
先看下 UIViewController 從創(chuàng)建 view 到展示的流程的幾個函數(shù)
- -init
- -initWithNibName:bundle:
這兩個方法都是初始化一個 vc,但請注意 view 不是這時候載入的
- -loadView
- -viewDidLoad
當(dāng)一個視圖準(zhǔn)備展現(xiàn)時,vc 首先會判斷 view 是否已經(jīng)創(chuàng)建否則便通過之前指定的 xib 文件來初始化 view,以及綁定其他關(guān)系(若沒有指定 xib 文件,則默認(rèn)會搜索和 vc 同名的 xib,比如 myNameViewController 就會搜索 myNameViewController.xib 文件)
若是沒有 xib 文件,你就可以在 loadview 中自己手動創(chuàng)建這個 viewControoler 需要的視圖。接下來就是調(diào)用到 -viewDidLoad,許多人喜歡在這里做些其他事情,比如做個 http 請求、建立個數(shù)組啥的。這里若不處理正確,-viewDidUnload 激活時內(nèi)存就容易泄露了,稍后提到。
- -view()appear
- -view()disappear
這幾個方法就不解釋了
- -viewDidUnload
該方法在收到內(nèi)存警告,同時該視圖并不在當(dāng)前界面顯示時候會被調(diào)用,此時該 controller 的 view 已經(jīng)被釋放并賦值為 nil。
接下來你要做的是把實例變量的子視圖釋放(IBOulet 的,以及自己添加的) 其他實例變量,比如之前在 -viewDidLoaded 中實例的數(shù)據(jù)數(shù)組、http 請求釋放掉
因為當(dāng)該 viewController 再次被激活準(zhǔn)備顯示時(比如 navigationControler 返回到上一級),vc 發(fā)現(xiàn)自己的 view 為空后會重復(fù)之前的流程直到把 view 給創(chuàng)建起來。若沒將自己額外添加的子視圖,各種類實例變量釋放,這里便會重新再次創(chuàng)建。
于是,內(nèi)存泄露了。
小結(jié):詳解UIViewController 內(nèi)存管理的內(nèi)容介紹完了,希望本文對你有所幫助。
轉(zhuǎn)自 http://ixhan.com/2011/02/uiviewcontroller-memory-manage/