標題中所說的3個方法,都是UIViewController的方法,跟UIViewController的view屬性的生命周期息息相關。接下來我會一一闡述它們的作用以及它們之間的聯系。
1.什麼時候被調用?
每次訪問UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會被調用。
2.有什麼作用?
loadView方法是用來負責創建UIViewController的view
3.默認實現是怎樣的?
默認實現即[super loadView]裡面做了什麼事情。
1> 它會先去查找與UIViewController相關聯的xib文件,通過加載xib文件來創建UIViewController的view
2> 如果沒有找到相關聯的xib文件,就會創建一個空白的UIView,然後賦值給UIViewController的view屬性,大致如下
[java] view plaincopy[super loadView]裡面就大致完成1>和2>中敘述的內容
4.怎樣正確使用這個方法?
大家都知道UIViewController的view可以通過xib文件來創建,但是在某些情況下,xib不是那麼地靈活,所以有時候我們想通過代碼來創建UIView,比如:
[java] view plaincopy如果想通過代碼來創建UIViewController的view,就要重寫loadView方法,並且不需要調用[super loadView],因為在第3點裡面已經提到:若沒有xib文件,[super loadView]默認會創建一個空白的UIView。我們既然要通過代碼來自定義UIView,那麼就沒必要事先創建一個空白的UIView,以節省不必要的開銷。正確的做法應該是這樣:
[java] view plaincopy不需要調用[super loadView],你調用了也不會出錯,只是造成了一些不必要的開銷。
總結一句話,蘋果設計這個方法就是給我們自定義UIViewController的view用的
1.什麼時候被調用?
不過你是通過xib文件還是重寫loadView創建UIViewController的view,在view創建完畢後,最終都會調用viewDidLoad方法
2.有什麼作用?
一般我們會在這裡做界面上的初始化操作,比如往view中添加一些子視圖、從數據庫或者網絡加載模型數據裝配到子視圖中。例如:
[java] view plaincopy1.什麼時候被調用?
iOS設備的內存是極其有限的,如果應用程序占用的內存過多的話,系統就會對應用程序發出內存警告。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認實現是:如果當前UIViewController的view不在應用程序的視圖層次結構(View Hierarchy)中,即view的superview為nil的時候,就會將view釋放,並且調用viewDidUnload方法
2.有什麼作用?
上面說到,發出內存警告且view被釋放的時候就會調用viewDidUnload方法,所以一般在釋放資源,主要是釋放界面元素相關的資源,將相關的實例都賦值為nil
[java] view plaincopy3.dealloc也是用來釋放資源的,那跟viewDidUnload有什麼關系?
當發出內存警告調用viewDidUnload方法時,只是釋放了view,並沒有釋放UIViewController,所以並不會調用dealloc方法。即viewDidUnload和dealloc方法並沒有任何關系,dealloc方法只會在UIViewController被釋放的時候調用
1.第一次訪問UIViewController的view時,view為nil,然後就會調用loadView方法創建view
2.view創建完畢後會調用viewDidLoad方法進行界面元素的初始化
3.當內存警告時,系統可能會釋放UIViewController的view,將view賦值為nil,並且調用viewDidUnload方法
4.當再次訪問UIViewController的view時,view已經在3中被賦值為nil,所以又會調用loadView方法重新創建view
5.view被重新創建完畢後,還是會調用viewDidLoad方法進行界面元素的初始化