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