viewDidUnload 和 dealloc 的区别
對于iphone開發(fā)人員來說,內(nèi)存管理是極為重要的技巧,哪怕程序的功能再強大,設(shè)計再漂亮,如果內(nèi)存控制不好,也難逃程序莫名退出的噩運,這與網(wǎng)頁開發(fā)是完全不同的。
內(nèi)存控制里面有很多門道,在這里分析一下 viewDidUnload 和 dealloc 的區(qū)別,關(guān)于這兩者的區(qū)別的文章很多,但是大都是摘抄和翻譯官方文檔,有的也只是簡單的說兩句,并沒有詳細說出兩者具體的區(qū)別。
在了解兩者之間的區(qū)別,首先要知道?view?的生命周期,google 里面有很多文章,可以先去搜一下,這里就不詳解了。
顧名思義 ?viewDidUnload?就是當 view 被卸載以后執(zhí)行的語句,它與 viewDidLoad 是相互呼應(yīng)的。大家都知道官方的解釋是執(zhí)行類似
?
self.myOutlet = nil;
?
的命令,但是為什么這么干,什么時候調(diào)用這個方法呢?
這個方法是不能手動調(diào)用的,它實際上是當應(yīng)用程序接收到手機內(nèi)存警告的時候自動調(diào)用的方法,目的就是清空內(nèi)存除當前?viewController?以外所有已經(jīng)加載過的?viewController 里面的暫時不再使用的一些控件或數(shù)據(jù),以避免應(yīng)用程序應(yīng)消耗內(nèi)存過多被強制關(guān)閉。記住,是除當前正在展示的 view?所屬?viewController 以外所有已經(jīng)在內(nèi)存里面的 viewController 執(zhí)行?viewDidUnload 方法,而不是當前 viewController?執(zhí)行 viewDidUnload,當然,這些 viewController 不會被 dealloc。所以在 viewDidUnload 里面一般都是釋放 IBOutlet 變量和在 viewDidLoad、viewWillAppear、viewDidAppear 等方法能夠重建的數(shù)據(jù)。而由其他頁面?zhèn)鬟f過來的數(shù)據(jù)或者無法經(jīng)過 viewDidLoad、viewWillAppear、viewDidAppear 等方法重建的數(shù)據(jù)則不能釋放,舉例子說如果在 navigationController 由上一個頁面?zhèn)鬟f過來的一張圖片,在 viewDidUnload 里被釋放的話,則當 view 再次加載的時候就無法恢復了。
那為什么要寫成 self.myOutlet = nil; ,實際上這個語法是執(zhí)行了 property 里的setter 方法,而不是一個簡單的變量賦值,它干了兩件事:1、老數(shù)據(jù) release?掉,2、新數(shù)據(jù)(nil)retain(當 property 設(shè)置為 retain 的情況下),當然對 nil retain 是無意義的。如果寫成 myOutlet = nil,那就是簡單的把 myOutlet 指向 nil,這樣內(nèi)存就泄漏了,因為老數(shù)據(jù)沒有 release。而如果僅僅寫成?[myOutlet release] 也會有問題,因為當 view?被 dealloc 的時候會 再次 release,程序就出錯了,而對 nil release 是沒有問題的。
?
dealloc?是當前 viewController 被釋放的時候,清空所有當前 viewController 里面的實體和數(shù)據(jù)來釋放內(nèi)存,該方法也是自動調(diào)用的,無需手動執(zhí)行。舉例說明當 modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一頁的時候,這個方法就會被自動調(diào)用。因為這個頁面已經(jīng)不再使用了,所以可以把所有實體和數(shù)據(jù)都釋放(release)掉。
其實兩者最大的區(qū)別就是: viewDidUnload 是內(nèi)存除當前以外所有 viewController 同時執(zhí)行,而 dealloc 只是當前 viewController 執(zhí)行。這個是網(wǎng)上的材料沒有說明的。
正如網(wǎng)上說viewDidUnload可以釋放一些容易重新構(gòu)建的東西,比如本地的圖片之類的,當然在viewDidLoad里必須重新構(gòu)建。
而對于不易重新構(gòu)建的東西,如重新從服務(wù)器下載的數(shù)據(jù),則可以放在init里構(gòu)建,viewDidUnload就不要將其釋放了。
PS: 很多朋友都說無法調(diào)試 viewDidUnload,其實是可以的。方法是在 iOS 模擬器的菜單里選 硬件 -> 模擬內(nèi)存警告,這個時候就可以看到 viewDidUnload 里面 NSLog 的東西了,可以試試在打開過的 viewController 里都 NSLog 一下看看效果。而 dealloc 里面可以直接 NSLog。
?
轉(zhuǎn)自:http://www.cnblogs.com/zhwl/archive/2012/06/06/2538494.html
轉(zhuǎn)載于:https://www.cnblogs.com/superchao8/archive/2012/09/18/2690586.html
總結(jié)
以上是生活随笔為你收集整理的viewDidUnload 和 dealloc 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Js让静态人物动起来Demo演示
- 下一篇: 【Android】Touch事件分发