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 執行。這個是網上的材料沒有說明的
轉自iOS分享網 https://iosshare.cn最後更新:2017-04-02 15:14:59