1.loadView
1)當(dāng)程序訪問(wèn)了控制器的view屬性時(shí),會(huì)判斷控制器的view是否已經(jīng)存在,如果已經(jīng)存在,會(huì)直接返回一個(gè)已經(jīng)存在的view。
2)如果不存在,那么就會(huì)調(diào)用控制器的loadView方法,如果控制器實(shí)現(xiàn)了這個(gè)方法,就會(huì)加載loadView方法中自定義的view。
3)如果沒(méi)有實(shí)現(xiàn)控制器的loadView方法,那么它會(huì)先去看一下當(dāng)前控制器是否從storyboard當(dāng)中創(chuàng)建的,如果是 就從storyboard當(dāng)中創(chuàng)建的view。
4)如果不是storyboard,那么它會(huì)去看有沒(méi)有指定nibName的xib,如果有,就從指定名稱的xib來(lái)描述控制器的view。
5)如果沒(méi)有指定名稱的xib,就會(huì)去看有沒(méi)有跟控制器名稱相同的xib,如果有,就用這個(gè)xib描述的view。
6)如果沒(méi)有跟控制器名稱相同的xib,那么就會(huì)去看有沒(méi)有跟控制器名稱相同去掉controller的xib,如果有,就用這個(gè)xib描述的view。
2.前面6步實(shí)際都是在做loadView,做完這一步之后,就調(diào)用viewDidLoad,只會(huì)被調(diào)用一次
3.在視圖顯示之前調(diào)用viewWillAppear,該函數(shù)可以被多次調(diào)用
4.在布局變化前后,調(diào)用viewWillLayoutSubviews\viewDidLayoutSubviews
5.視圖顯示完畢,調(diào)用viewDidAppear
6.在視圖消失之前,調(diào)用viewWillDisApperar,該函數(shù)可以被多次調(diào)用
7.視圖消失完畢,調(diào)用viewDidDisAppear。
8.控制器還有三個(gè)方法需要注意:viewWillUnload\viewDidUnload\didReceiveMemoryWarning
8.1當(dāng)程序內(nèi)存不夠用時(shí),最先拿到內(nèi)存警告的是UIApplication→Window→Window.rootViewController→.....(一層一層往下傳).
8.2當(dāng)控制器收到內(nèi)存警告時(shí),如果要確定要銷毀View,則會(huì)調(diào)用viewWillUnload/viewDidUnload
9.當(dāng)控制器的View被銷毀之后,如果又需要顯示,則控制器會(huì)調(diào)用loadView,又從第一步的loadView開(kāi)始走一遍
總結(jié):控制器的生命周期實(shí)際是一個(gè)閉合的環(huán).