iOS開發(fā)之loadView唐责、viewDidLoad及viewDidUnload的關(guān)系 2018-09-07

標題中所說的3個方法,都是UIViewController的方法弓柱,跟UIViewController的view屬性的生命周期息息相關(guān)。接下來我會一一闡述它們的作用以及它們之間的聯(lián)系侧但。

一矢空、loadView

1.什么時候被調(diào)用?

每次訪問UIViewController的view(比如controller.view俊犯、self.view)而且view為nil妇多,loadView方法就會被調(diào)用。

2.有什么作用燕侠?

loadView方法是用來負責創(chuàng)建UIViewController的view

3.默認實現(xiàn)是怎樣的者祖?

默認實現(xiàn)即[super loadView]里面做了什么事情立莉。

1> 它會先去查找與UIViewController相關(guān)聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view

如果在初始化UIViewController指定了xib文件名七问,就會根據(jù)傳入的xib文件名加載對應的xib文件

[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

如果沒有明顯地傳xib文件名蜓耻,就會加載跟UIViewController同名的xib文件

[[MJViewController alloc] init]; // 加載MJViewController.xib

2> 如果沒有找到相關(guān)聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView械巡,然后賦值給UIViewController的view屬性刹淌,大致如下

self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}

[super loadView]里面就大致完成1>和2>中敘述的內(nèi)容

4.怎樣正確使用這個方法?

大家都知道UIViewController的view可以通過xib文件來創(chuàng)建讥耗,但是在某些情況下有勾,xib不是那么地靈活,所以有時候我們想通過代碼來創(chuàng)建UIView古程,比如:

self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

?如果想通過代碼來創(chuàng)建UIViewController的view蔼卡,就要重寫loadView方法,并且不需要調(diào)用[super

loadView]挣磨,因為在第3點里面已經(jīng)提到:若沒有xib文件雇逞,[super

loadView]默認會創(chuàng)建一個空白的UIView。我們既然要通過代碼來自定義UIView茁裙,那么就沒必要事先創(chuàng)建一個空白的UIView塘砸,以節(jié)省不必要的開銷。正確的做法應該是這樣:

1 - (void)loadView {

2? ? self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

3 }

不需要調(diào)用[super loadView]晤锥,你調(diào)用了也不會出錯掉蔬,只是造成了一些不必要的開銷。

總結(jié)一句話查近,蘋果設計這個方法就是給我們自定義UIViewController的view用的

?

二眉踱、viewDidLoad

1.什么時候被調(diào)用?

無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view霜威,在view創(chuàng)建完畢后谈喳,最終都會調(diào)用viewDidLoad方法

2.有什么作用?

一般我們會在這里做界面上的初始化操作戈泼,比如往view中添加一些子視圖婿禽、從數(shù)據(jù)庫或者網(wǎng)絡加載模型數(shù)據(jù)裝配到子視圖中。例如:

1 - (void)viewDidLoad

2 {

3? ? [super viewDidLoad];

4? ?

5? ? // 添加一個按鈕

6? ? UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];

7? ? [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];

8? ? [self.view addSubview:button];

9 }

?

三大猛、viewDidUnload

1.什么時候被調(diào)用扭倾?

iOS設備的內(nèi)存是極其有限的,如果應用程序占用的內(nèi)存過多的話挽绩,系統(tǒng)就會對應用程序發(fā)出內(nèi)存警告膛壹。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認實現(xiàn)是:如果當前UIViewController的view不在應用程序的視圖層次結(jié)構(gòu)(View

Hierarchy)中,即view的superview為nil的時候模聋,就會將view釋放肩民,并且調(diào)用viewDidUnload方法

2.有什么作用?

上面說到链方,發(fā)出內(nèi)存警告且view被釋放的時候就會調(diào)用viewDidUnload方法持痰,所以一般在釋放資源,主要是釋放界面元素相關(guān)的資源祟蚀,將相關(guān)的實例都賦值為nil

1 - (void)viewDidUnload {

2? ? [super viewDidUnload];

3? ? self.name = nil;

4? ? self.pwd = nil;

5 }

3.dealloc也是用來釋放資源的工窍,那跟viewDidUnload有什么關(guān)系?

當發(fā)出內(nèi)存警告調(diào)用viewDidUnload方法時前酿,只是釋放了view患雏,并沒有釋放UIViewController,所以并不會調(diào)用dealloc方法罢维。即viewDidUnload和dealloc方法并沒有任何關(guān)系纵苛,dealloc方法只會在UIViewController被釋放的時候調(diào)用

?

四、三個方法的關(guān)系

1.第一次訪問UIViewController的view時言津,view為nil,然后就會調(diào)用loadView方法創(chuàng)建view

2.view創(chuàng)建完畢后會調(diào)用viewDidLoad方法進行界面元素的初始化

3.當內(nèi)存警告時取试,系統(tǒng)可能會釋放UIViewController的view悬槽,將view賦值為nil,并且調(diào)用viewDidUnload方法

4.當再次訪問UIViewController的view時瞬浓,view已經(jīng)在3中被賦值為nil初婆,所以又會調(diào)用loadView方法重新創(chuàng)建view

5.view被重新創(chuàng)建完畢后,還是會調(diào)用viewDidLoad方法進行界面元素的初始化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猿棉,一起剝皮案震驚了整個濱河市磅叛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萨赁,老刑警劉巖弊琴,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杖爽,居然都是意外死亡敲董,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門慰安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腋寨,“玉大人,你說我怎么就攤上這事化焕√汛埽” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長查刻。 經(jīng)常有香客問我键兜,道長,這世上最難降的妖魔是什么赖阻? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任蝶押,我火速辦了婚禮,結(jié)果婚禮上火欧,老公的妹妹穿的比我還像新娘棋电。我一直安慰自己,他們只是感情好苇侵,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布赶盔。 她就那樣靜靜地躺著,像睡著了一般榆浓。 火紅的嫁衣襯著肌膚如雪于未。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天陡鹃,我揣著相機與錄音烘浦,去河邊找鬼。 笑死萍鲸,一個胖子當著我的面吹牛闷叉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脊阴,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼握侧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘿期?” 一聲冷哼從身側(cè)響起品擎,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备徐,沒想到半個月后萄传,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坦喘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年盲再,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓣铣。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡答朋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棠笑,到底是詐尸還是另有隱情梦碗,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站洪规,受9級特大地震影響印屁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斩例,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一雄人、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧念赶,春花似錦础钠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至停局,卻和暖如春很钓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背董栽。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工码倦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锭碳。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓叹洲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親工禾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 國慶假期與許久未見的朋友小聚了一回蝗柔。 聚會時闻葵,一朋友問我現(xiàn)在在做什么(職位)。我回答了:設計癣丧,偶爾兼顧一些文案工作...
    曦大夫閱讀 227評論 0 1
  • 一輪明月照高樓 天上人間地上憂 手拖月盤笑顏柔 中秋團圓樂悠悠 夫妻恩愛兒女逗 父母盼著絮舊游 舉杯同歡把節(jié)度 遙...
    田萍閱讀 144評論 0 1
  • [1] 回到家時槽畔,已是深夜十點半。 最近事情很多胁编,每天都是這個點回到家厢钧。雖然付出了大力氣,可結(jié)果并不如意嬉橙。然而更讓...
    孤舟泛跡閱讀 427評論 0 0
  • (一)什么是 JSPatch JSPatch 是一個開源項目(Github鏈接)早直,只需要在項目里引入極小的引擎文件...
    天空像天空一樣藍閱讀 2,409評論 0 2
  • 七分愛你三分愛己 沒有怕過,唯獨你市框! 傷疤不會無故發(fā)痛霞扬,除非你揭開它。沒有人能傷到你除非你愿意。
    王呼呼和大叔閱讀 307評論 0 0