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

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

由init、loadView、viewDidLoad、viewDidUnload、dealloc的關系說起

分類: iOS 273人閱讀 評論(0) 收藏 舉報

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

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

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

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

 

self.myOutlet = nil;

 

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

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

那為什么要寫成 self.myOutlet = nil; ,實際上這個語法是執(zhí)行了 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 里面的實體和數據來釋放內存,該方法也是自動調用的,無需手動執(zhí)行。舉例說明當 modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一頁的時候,這個方法就會被自動調用。因為這個頁面已經不再使用了,所以可以把所有實體和數據都釋放(release)掉。

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

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



由init、loadView、viewDidLoad、viewDidUnload、dealloc的關系說起

init方法

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

init方法中初始化ViewController本身

 loadView方法

當view需要被展示而它卻是nil時,viewController會調用該方法。不要直接調用該方法。

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

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

loadView和IB構建view

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

 

viewDidLoad方法

viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。

重載重寫該方法以進一步定制view

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

viewDidLoad后調用數據Model

viewDidUnload方法

當系統(tǒng)內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)

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

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

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

一般認為viewDidUnload是viewDidLoad的鏡像,因為當view被重新請求時,viewDidLoad還會重新被執(zhí)行

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

dealloc方法

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

看到以下的代碼

- (void)viewDidUnload {

self.detailViewController = nil; 

self.languageNames = nil; 

self.languageCodes = nil;

}

- (void)dealloc {

[detailViewController release];

 [languageNames release]; 

[languageCodes release]; 

[super dealloc];

}


如果是先調用viewDidUnload后再調用dealloc, 那么languageNames都已經是nil了,再掉release有什么意義呢?
原 因似乎是, 對一個viewcontroller來說,它的數據的初始化在init中,而它管理的view采用了lazy load的方式,也就是有需要的時候才會載入, 所以跟view相關的數據可以在viewDidLoad(也就是在view被載入的時候)進行初始化。當內存緊張的時候, ios會銷毀點一些view, 通過調用viewDidUnload (里面一般也只是把跟view相關的數據設為nil), 但這個時候viewcontroller本身還在, 所以它的dealloc不會被調用,除非是到了viewcontroller也被銷毀的時候
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲一区二区在线播放| 国产精品私人影院| 国产视频精品网| 亚洲天堂第二页| 亚洲精品国产系列| 美国十次了思思久久精品导航| 免费高清在线视频一区·| 日韩视频在线一区| 久久久久国产精品人| 国产综合自拍| 久久精品日韩一区二区三区| 亚洲欧美在线观看| 国产精品一区一区| 欧美一级日韩一级| 亚洲欧美成人网| 国产一区二区剧情av在线| 欧美亚洲一区二区三区| 亚洲精品日韩一| 欧美日韩大陆在线| 亚洲一区二区精品| 亚洲伊人一本大道中文字幕| 国产精品成人一区| 欧美亚洲视频一区二区| 欧美一区二区三区免费看| 国产欧美日韩不卡免费| 久久免费视频观看| 看片网站欧美日韩| 夜夜嗨一区二区| 亚洲大片在线观看| 欧美精品在线视频| 午夜精品视频| 久久久久久久一区二区| 亚洲国产专区校园欧美| 亚洲黄色免费| 国产精品久久久久一区二区三区| 在线观看亚洲精品视频| 欧美a一区二区| 欧美日韩p片| 欧美一级午夜免费电影| 久久久久亚洲综合| 在线亚洲伦理| 久久九九久精品国产免费直播| 免费在线欧美视频| 亚洲调教视频在线观看| 亚洲男人的天堂在线aⅴ视频| 欧美aa在线视频| 欧美亚洲在线| 欧美风情在线| 久久免费黄色| 欧美精品亚洲精品| 久久综合99re88久久爱| 欧美激情亚洲激情| 久久久久综合一区二区三区| 久久先锋影音| 欧美在线精品免播放器视频| 免费成人av在线| 久久高清一区| 欧美日韩亚洲一区二区三区四区 | 亚洲视频香蕉人妖| 亚洲综合色噜噜狠狠| 91久久精品一区二区别| 午夜欧美电影在线观看| 一本久久a久久精品亚洲| 欧美亚洲免费高清在线观看| 99精品99| 欧美暴力喷水在线| 久久蜜臀精品av| 国产欧美日本在线| av成人国产| 99在线热播精品免费99热| 久久精品免费| 久久av免费一区| 国产精品老牛| 亚洲性图久久| 亚洲一区免费| 欧美日韩亚洲成人| 亚洲美女中文字幕| 一区二区三区黄色| 欧美精品激情在线| 亚洲国产精品久久久| 亚洲高清网站| 美日韩丰满少妇在线观看| 可以看av的网站久久看| 黄色国产精品| 久久久亚洲影院你懂的| 销魂美女一区二区三区视频在线| 亚洲欧美成人网| 欧美一级电影久久| 国产欧美一区二区在线观看| 亚洲一区日本| 久久久99国产精品免费| 国产欧美视频一区二区三区| 国产精品99久久久久久白浆小说| 国产日产欧美a一级在线| 亚洲免费在线看| 亚洲免费婷婷| 欧美视频免费在线| 亚洲视频香蕉人妖| 欧美一区深夜视频| 伊人成年综合电影网| 欧美在线播放| 亚洲成色777777在线观看影院| 欧美日韩国产综合网| 99国内精品| 欧美一区二区三区四区在线| 国产一区二区三区四区在线观看 | 国产精品女主播| 亚洲欧美日韩高清| 久久久欧美精品| 亚洲第一免费播放区| 美女精品视频一区| 99视频在线观看一区三区| 亚洲欧美怡红院| 激情一区二区| 欧美精品在线网站| 小嫩嫩精品导航| 欧美大片在线看| 亚洲欧美日韩爽爽影院| 国产综合色产| 欧美成人午夜| 亚洲伦理一区| 久久久激情视频| 亚洲精品免费看| 国产视频一区二区在线观看| 免费成人美女女| 午夜精品久久久久久久久久久久久| 亚洲免费观看高清完整版在线观看熊| 亚洲综合另类| 欧美超级免费视 在线| 亚洲少妇一区| 国内伊人久久久久久网站视频| 日韩亚洲在线| 久久综合伊人77777麻豆| 亚洲视频中文字幕| 亚洲国产精品999| 国产精品手机视频| 欧美精品粉嫩高潮一区二区 | 欧美日韩一区二区三区在线| 香蕉亚洲视频| 亚洲视频在线免费观看| 亚洲福利国产| 麻豆国产精品777777在线| 亚洲免费小视频| 亚洲国产日韩欧美在线动漫 | 亚洲精品一级| 在线观看91精品国产麻豆| 欧美午夜国产| 欧美aaa级| 久久综合色影院| 午夜久久美女| 亚洲一区二区三区免费在线观看| 亚洲一区精品视频| 亚洲毛片av| 亚洲国产精品一区| 国产视频在线一区二区 | 欧美日韩国产成人在线91| 欧美二区在线观看| 欧美日韩三级视频| 国产精品久久久久久久7电影| 欧美一区中文字幕| 久久亚洲春色中文字幕久久久| 最新国产乱人伦偷精品免费网站| 亚洲免费网站| 欧美综合国产| 看欧美日韩国产| 亚洲第一精品夜夜躁人人爽 | 精品成人久久| 亚洲国产专区| 亚洲一区二区四区| 久久精品视频在线播放| 老色鬼久久亚洲一区二区| 亚洲高清在线精品| 亚洲一区欧美一区| 久久精品中文字幕免费mv| 欧美粗暴jizz性欧美20| 国产精品白丝jk黑袜喷水| 国产一区二区黄| 日韩亚洲在线观看| 久久精品一本| 亚洲精品一区二区在线| 亚洲欧美在线一区| 欧美 日韩 国产一区二区在线视频| 羞羞视频在线观看欧美| 免费日韩av| 国产美女一区二区| 亚洲美女黄色| 久久久久久成人| 一区二区日韩伦理片| 久久精品五月| 欧美色综合天天久久综合精品| 欧美激情一区在线观看| 国产欧美在线视频| 日韩视频在线一区二区| 久久网站免费| 亚洲一区二区影院| 欧美精品在线视频| 18成人免费观看视频| 欧美亚洲免费在线| 一本久道久久综合中文字幕 | 久久精品视频在线|