青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
原文:http://blog.csdn.net/weiqubo/article/details/8152326

由init、loadView、viewDidLoad、viewDidUnload、dealloc的關(guān)系說起

分類: iOS 273人閱讀 評(píng)論(0) 收藏 舉報(bào)

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

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

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

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

 

self.myOutlet = nil;

 

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

這個(gè)方法是不能手動(dòng)調(diào)用的,它實(shí)際上是當(dāng)應(yīng)用程序接收到手機(jī)內(nèi)存警告的時(shí)候自動(dòng)調(diào)用的方法,目的就是清空內(nèi)存除當(dāng)前 viewController 以外所有已經(jīng)加載過的 viewController 里面的暫時(shí)不再使用的一些控件或數(shù)據(jù),以避免應(yīng)用程序應(yīng)消耗內(nèi)存過多被強(qiáng)制關(guān)閉。記住,是除當(dāng)前正在展示的 view 所屬 viewController 以外所有已經(jīng)在內(nèi)存里面的 viewController 執(zhí)行 viewDidUnload 方法, 而不是當(dāng)前 viewController 執(zhí)行 viewDidUnload,當(dāng)然,這些 viewController 不會(huì)被 dealloc。所以在 viewDidUnload 里面一般都是釋放 IBOutlet 變量和在 viewDidLoad、viewWillAppear、viewDidAppear 等方法能夠重建的數(shù)據(jù)。而由其他頁面?zhèn)鬟f過來的數(shù)據(jù)或者無法經(jīng)過 viewDidLoad、viewWillAppear、viewDidAppear 等方法重建的數(shù)據(jù)則不能釋放,舉例子說如果在 navigationController 由上一個(gè)頁面?zhèn)鬟f過來的一張圖片,在 viewDidUnload 里被釋放的話,則當(dāng) view 再次加載的時(shí)候就無法恢復(fù)了。

那為什么要寫成 self.myOutlet = nil; ,實(shí)際上這個(gè)語法是執(zhí)行了 property 里的setter 方法,而不是一個(gè)簡(jiǎn)單的變量賦值,它干了兩件事:1、老數(shù)據(jù) release 掉,2、新數(shù)據(jù)(nil)retain(當(dāng) property 設(shè)置為 retain 的情況下),當(dāng)然對(duì) nil retain 是無意義的。如果寫成 myOutlet = nil,那就是簡(jiǎn)單的把 myOutlet 指向 nil,這樣內(nèi)存就泄漏了,因?yàn)槔蠑?shù)據(jù)沒有 release。而如果僅僅寫成 [myOutlet release] 也會(huì)有問題,因?yàn)楫?dāng) view 被 dealloc 的時(shí)候會(huì) 再次 release,程序就出錯(cuò)了,而對(duì) nil release 是沒有問題的。
 
dealloc 是當(dāng)前 viewController 被釋放的時(shí)候,清空所有當(dāng)前 viewController 里面的實(shí)體和數(shù)據(jù)來釋放內(nèi)存,該方法也是自動(dòng)調(diào)用的,無需手動(dòng)執(zhí)行。舉例說明當(dāng) modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一頁的時(shí)候,這個(gè)方法就會(huì)被自動(dòng)調(diào)用。因?yàn)檫@個(gè)頁面已經(jīng)不再使用了,所以可以把所有實(shí)體和數(shù)據(jù)都釋放(release)掉。

其實(shí)兩者最大的區(qū)別就是: viewDidUnload 是內(nèi)存除當(dāng)前以外所有 viewController 同時(shí)執(zhí)行,而 dealloc 只是當(dāng)前 viewController 執(zhí)行。這個(gè)是網(wǎng)上的材料沒有說明的。

個(gè)人拙見,不對(duì)之處還請(qǐng)?zhí)嵴?br />
PS: 很多朋友都說無法調(diào)試 viewDidUnload,其實(shí)是可以的。方法是在 iOS 模擬器的菜單里選 硬件->模擬內(nèi)存警告,這個(gè)時(shí)候就可以看到 viewDidUnload 里面 NSLog 的東西了,可以試試在打開過的 viewController 里都 NSLog 一下看看效果。而 dealloc 里面可以直接 NSLog。



由init、loadView、viewDidLoad、viewDidUnload、dealloc的關(guān)系說起

init方法

在init方法中實(shí)例化必要的對(duì)象(遵從LazyLoad思想)

init方法中初始化ViewController本身

 loadView方法

當(dāng)view需要被展示而它卻是nil時(shí),viewController會(huì)調(diào)用該方法。不要直接調(diào)用該方法。

如果手工維護(hù)views,必須重載重寫該方法

如果使用IB維護(hù)views,必須不能重載重寫該方法

loadView和IB構(gòu)建view

你在控制器中實(shí)現(xiàn)了loadView方法,那么你可能會(huì)在應(yīng)用運(yùn)行的某個(gè)時(shí)候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時(shí)候, view 控制器會(huì)收到didReceiveMemoryWarning的消息。 默認(rèn)的實(shí)現(xiàn)是檢查當(dāng)前控制器的view是否在使用。 如果它的view不在當(dāng)前正在使用的view hierarchy里面,且你的控制器實(shí)現(xiàn)了loadView方法,那么這個(gè)view將被release, loadView方法將被再次調(diào)用來創(chuàng)建一個(gè)新的view。

 

viewDidLoad方法

viewDidLoad 此方法只有當(dāng)view從nib文件初始化的時(shí)候才被調(diào)用。

重載重寫該方法以進(jìn)一步定制view

在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload來釋放對(duì)view的任何索引

viewDidLoad后調(diào)用數(shù)據(jù)Model

viewDidUnload方法

當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法(注:viewController沒有被dealloc)

內(nèi)存吃緊時(shí),在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式

在該方法中將所有IBOutlet(無論是property還是實(shí)例變量)置為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)

在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象、在viewDidLoad中被創(chuàng)建的對(duì)象、緩存數(shù)據(jù)等 release對(duì)象后,將對(duì)象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)release view時(shí)已經(jīng)將其release掉了)

一般認(rèn)為viewDidUnload是viewDidLoad的鏡像,因?yàn)楫?dāng)view被重新請(qǐng)求時(shí),viewDidLoad還會(huì)重新被執(zhí)行

viewDidUnload中被release的對(duì)象必須是很容易被重新創(chuàng)建的對(duì)象(比如在viewDidLoad或其他方法中創(chuàng)建的對(duì)象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對(duì)象

dealloc方法

viewDidUnload和dealloc方法沒有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情

看到以下的代碼

- (void)viewDidUnload {

self.detailViewController = nil; 

self.languageNames = nil; 

self.languageCodes = nil;

}

- (void)dealloc {

[detailViewController release];

 [languageNames release]; 

[languageCodes release]; 

[super dealloc];

}


如果是先調(diào)用viewDidUnload后再調(diào)用dealloc, 那么languageNames都已經(jīng)是nil了,再掉release有什么意義呢?
原 因似乎是, 對(duì)一個(gè)viewcontroller來說,它的數(shù)據(jù)的初始化在init中,而它管理的view采用了lazy load的方式,也就是有需要的時(shí)候才會(huì)載入, 所以跟view相關(guān)的數(shù)據(jù)可以在viewDidLoad(也就是在view被載入的時(shí)候)進(jìn)行初始化。當(dāng)內(nèi)存緊張的時(shí)候, ios會(huì)銷毀點(diǎn)一些view, 通過調(diào)用viewDidUnload (里面一般也只是把跟view相關(guān)的數(shù)據(jù)設(shè)為nil), 但這個(gè)時(shí)候viewcontroller本身還在, 所以它的dealloc不會(huì)被調(diào)用,除非是到了viewcontroller也被銷毀的時(shí)候
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品亚洲综合一区在线观看| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲国产毛片完整版| 在线一区二区三区做爰视频网站| 国外成人在线视频网站| 国产欧美日韩伦理| 国产拍揄自揄精品视频麻豆| 国产乱码精品一区二区三区不卡| 国产精品一区二区久激情瑜伽| 欧美午夜久久| 欧美色网在线| 欧美亚男人的天堂| 国产精品一区二区欧美| 国产亚洲精品一区二555| 国产一区二区无遮挡| 亚洲福利专区| 亚洲婷婷综合色高清在线| 性欧美大战久久久久久久久| 欧美自拍丝袜亚洲| 久久人人爽人人| 亚洲福利视频一区| 亚洲一区二区3| 久久九九久精品国产免费直播| 欧美成人激情视频| 国产精品三级久久久久久电影| 国产专区欧美精品| 日韩视频中文| 久久久久久亚洲综合影院红桃 | 亚洲视频在线观看视频| 亚洲自拍偷拍视频| 久久夜色精品国产亚洲aⅴ | 免费在线亚洲欧美| 野花国产精品入口| 久久久久久久久综合| 欧美日韩三区| 极品中文字幕一区| 一区二区三区免费看| 久久久久久久网| 亚洲精品国产拍免费91在线| 亚洲欧美激情视频在线观看一区二区三区| 久久久久久久国产| 国产精品女主播在线观看| 黑丝一区二区| 午夜视频一区二区| 亚洲伦伦在线| 猛干欧美女孩| 亚洲视频香蕉人妖| 蜜臀a∨国产成人精品| 国产精品理论片| 欧美成人免费全部| 亚洲理论在线| 亚洲日本va午夜在线电影| 亚洲视频第一页| 欧美插天视频在线播放| 亚洲欧美日韩区| 国产精品久久久久9999高清| 亚洲精品欧美在线| 欧美高清视频一二三区| 久久人人爽人人爽爽久久| 国产乱码精品一区二区三区忘忧草 | 亚洲国产综合视频在线观看| 欧美一区二区三区视频在线| 一区二区三区四区国产| 免费观看国产成人| 久久在线观看视频| 老司机aⅴ在线精品导航| 亚洲小视频在线观看| 久久国产免费| 欧美大片91| 亚洲伦理网站| 久久亚洲综合网| 久久久国产精品一区二区中文 | 91久久国产自产拍夜夜嗨| 久久亚洲国产精品一区二区| 国产精品日韩| 欧美在线观看日本一区| 亚洲欧洲日产国产网站| 欧美激情一区| 亚洲精品网站在线播放gif| 亚洲第一区在线| 欧美1区3d| 亚洲一区二区av电影| 亚洲欧洲日韩综合二区| 羞羞答答国产精品www一本| 国产一区二区主播在线| 欧美一区二区视频在线| 亚洲欧美日韩在线一区| 国产精品蜜臀在线观看| 久久精品欧美日韩| 久久久久久色| 在线视频成人| 亚洲欧洲精品成人久久奇米网| 在线中文字幕日韩| 欧美午夜精品理论片a级大开眼界| 欧美激情视频一区二区三区在线播放| 亚洲午夜电影在线观看| 国产精品久久9| 久久夜色精品国产| 欧美三级午夜理伦三级中文幕 | 欧美成人一区二区三区在线观看| 亚洲一区二区三区精品视频| 欧美精品自拍| 亚洲乱码国产乱码精品精| 一区二区免费在线视频| 国产精品久久久久秋霞鲁丝| 久久精品99国产精品日本| 亚洲精品1区2区| 国产网站欧美日韩免费精品在线观看 | 欧美在线播放| 伊人久久综合97精品| 一区二区三区|亚洲午夜| 国产精品入口麻豆原神| 亚洲激情影视| 国产精品嫩草影院av蜜臀| 欧美成人精品在线播放| 欧美精品二区| 老司机午夜精品| 欧美高清在线一区| 久久亚洲精品网站| 欧美激情精品久久久久久久变态| 久久国产精品一区二区| 欧美国产日本韩| 麻豆精品视频在线观看| 欧美日韩中文字幕日韩欧美| 亚洲国产mv| 国产综合网站| 亚洲欧美综合v| 99精品国产高清一区二区| 午夜视频久久久| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美亚日韩国产aⅴ精品中极品| 久久精品国产综合精品| 欧美激情综合五月色丁香| 欧美va亚洲va国产综合| 国产欧美日韩亚洲精品| 亚洲一区欧美一区| 久久久久久久久久久久久久一区| 亚洲欧美国产高清va在线播| 欧美国产丝袜视频| 在线观看一区| 国产精品99久久久久久久久| 亚洲视频在线看| 欧美成人午夜激情| 亚洲国产精品v| 亚洲国产成人porn| 欧美xart系列高清| 亚洲国产精品悠悠久久琪琪| 亚洲精品视频在线播放| 国产日韩免费| 亚洲欧美综合精品久久成人| 亚洲精品视频在线观看网站| 欧美日韩国产天堂| 久久久蜜桃一区二区人| 在线精品国精品国产尤物884a| 久久天堂精品| 欧美丰满高潮xxxx喷水动漫| 亚洲高清资源综合久久精品| 久久久久久久网| 亚洲狠狠丁香婷婷综合久久久| 亚洲二区免费| 免费在线播放第一区高清av| 亚洲福利电影| 欧美精品日韩精品| 久久久中精品2020中文| 亚洲欧洲另类| 欧美一区二区三区的| 美女福利精品视频| 亚洲电影观看| 欧美激情视频一区二区三区在线播放| 日韩一级大片在线| 91久久精品网| 国产精品资源在线观看| 亚洲精品乱码久久久久久按摩观| 一区二区毛片| 国产精品欧美日韩一区二区| 久久精品二区亚洲w码| 免费永久网站黄欧美| 亚洲综合大片69999| 国产伦精品一区二区三区四区免费 | 亚洲日本成人网| 亚洲精品一级| 国产欧美日韩一区二区三区在线| 亚洲一区免费网站| 欧美激情一区二区久久久| 亚洲制服av| 国内久久婷婷综合| 欧美午夜精品久久久久免费视 | 欧美成人免费全部| 亚洲一区二区免费视频| 亚洲第一成人在线| 亚洲一区二区三区免费在线观看 | 国产毛片一区二区| 蜜臀久久99精品久久久久久9| 亚洲校园激情| 欧美成人精品一区二区| 国内精品久久久久影院薰衣草| 久久久久久999| 一区二区三区毛片| 久久在线91| 亚洲伊人一本大道中文字幕|