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