日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

viewDidUnload 和 dealloc 的区别

發(fā)布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 viewDidUnload 和 dealloc 的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于iphone開發(fā)人員來說,內(nèi)存管理是極為重要的技巧,哪怕程序的功能再強大,設計再漂亮,如果內(nèi)存控制不好,也難逃程序莫名退出的噩運,這與網(wǎng)頁開發(fā)是完全不同的。

內(nèi)存控制里面有很多門道,在這里分析一下 viewDidUnload 和 dealloc 的區(qū)別,關(guān)于這兩者的區(qū)別的文章很多,但是大都是摘抄和翻譯官方文檔,有的也只是簡單的說兩句,并沒有詳細說出兩者具體的區(qū)別。

在了解兩者之間的區(qū)別,首先要知道?view?的生命周期,google 里面有很多文章,可以先去搜一下,這里就不詳解了。

顧名思義 ?viewDidUnload?就是當 view 被卸載以后執(zhí)行的語句,它與 viewDidLoad 是相互呼應的。大家都知道官方的解釋是執(zhí)行類似

?

self.myOutlet = nil;

?

的命令,但是為什么這么干,什么時候調(diào)用這個方法呢?

這個方法是不能手動調(diào)用的,它實際上是當應用程序接收到手機內(nèi)存警告的時候自動調(diào)用的方法,目的就是清空內(nèi)存除當前?viewController?以外所有已經(jīng)加載過的?viewController 里面的暫時不再使用的一些控件或數(shù)據(jù),以避免應用程序應消耗內(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 設置為 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)建的東西,如重新從服務器下載的數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。