瞭解和運用的UIViewController生命週期

在此之前,我們要先了解UIViewController的生命週期。

UIViewController是IOS程序中的一個重要組成部分,扮演者一個大管家的身份,管理着程序中的衆多視圖:

何時加載view,加載的原則是什麼,視圖何時消失等問題,文檔中講的都很詳細。

  Controller的view最好在需要顯示時再去加載,並且在系統發出內存警告時釋放不必要的view及相關的可再生的數據對象。

一、UIViewController的初始化

  初始化時會根據需要調用init,initWithCoder等相關函數,這個時候我們可以做一下簡單的初始化操作,建立ViewController中需要使用的數據模型等,不建議在初始化階段就直接創建view及其他與顯示有關的對象(應該放到loadView的時候去創建,或者採用懶加載的方法創建)。

  我們都知道ViewController可以通過代碼和xib兩種方式創建,這兩種方式的初始化流程也不盡相同。

  1)使用xib創建的VC

  xib其實最終是會把我們的設置保存成一個數據集(xml文件),當需要初始化構建VC的時候,回去讀取記錄的數據集,然後幫我們動態的創建VC,因此可以想象它在初始化時會先去找看是否實現initWithCoder方法,如果該類實現了該方法,就直接調用initWithCoder方法創建對象,如果沒有實現的話就調用init方法。調用完初始化方法以後緊接着會調用awakeFromNib方法,在這個方法裏面我們可以做進一步的初始化操作。

  2)使用代碼創建VC

  使用代碼創建時,我們根據需要手動的創建VC中的數據,如果自己定製VC時,還需要在init中調用[super init]

二、UIViewController中View的load和unload

  前面講了不建議在VC初始化的時候就創建view及其他與顯示相關的代碼,官方文檔建議將View的初始化操作放到loadView的時候再做,當VC接到內存告警時會調用didRecieveMemoryWarning這個時候我們就要做出響應,釋放暫時不需要的對象。如果無視這個警告,系統內存不夠用時會會繼續發送,如果還得不到處理就會強制退出程序。下面看具體的loadView和unloadView時候都會做什麼操作。

  1)Load週期

load cycle

  當需要顯示或者訪問view屬性時,view沒有創建的話,VC就會調用loadView方法,在這個時候會創建一個view並將其賦給VC.view屬性。緊接着就會調用VC的viewDidLoad方法,這個時候VC.view保證是有值的,可以做進一步的初始化操作,例如添加一些subview。注意:定製VC時,如果覆蓋loadView方法,不需要調用[super loadView]方法。

  2)Unload週期

  當app收到內存警告的時候,會調用每一個VC的didRecieveMemoryWarning方法,我們需要做出響應,釋放程序中暫時不需要的資源。通常都會重寫該方法,重寫時候需要調用super的該方法。如果檢測到當前VC的view可以被安全釋放的話,就會調用viewWillUnload方法,這個我們必須要重視,因爲當VC的view消失時候它的subviews可能會被一起釋放,我們需要根據具體情況做一些記錄,以保證下次能夠正確創建,同時不出現內存泄漏。調用viewWillUnload以後,會將VC.view屬性設置成nil,然後在調用viewDidUnload方法,這個時候我們可以釋放那些強引用的對象。


我們再瞭解一下他們的一些方法

當一個視圖控制器被創建,並在屏幕上顯示的時候。 代碼的執行順序
1、 alloc                                   創建對象,分配空間
2、init (initWithNibName) 初始化對象,初始化數據
3、loadView                          從nib載入視圖 ,通常這一步不需要去幹涉。除非你沒有使用xib文件創建視圖
4、viewDidLoad                   載入完成,可以進行自定義數據以及動態創建其他控件
5、viewWillAppear              視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
6、viewDidAppear               視圖已在屏幕上渲染完成

當一個視圖被移除屏幕並且銷燬的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear            視圖將被從屏幕上移除之前執行
2、viewDidDisappear             視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc                                 視圖被銷燬,此處需要對你在init和viewDidLoad中創建的對象進行釋放

關於viewDidUnload :在發生內存警告的時候如果本視圖不是當前屏幕上正在顯示的視圖的話, viewDidUnload將會被執行,本視圖的所有子視圖將被銷燬,以釋放內存,此時開發者需要手動對viewLoad、viewDidLoad中創建的對象釋放內存。 因爲當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。

運用uiviewcontroller生命週期

1.如果這個controller有對camera(相機)的控制,務必在viewDidLoad中把camera相關的變量申請和初始化好,在viewWillAppear的時候打開camera,在viewDidDisappear的時候關閉camera。

2.如果有兩個controller: CA和CB。CA有變量a(會在view上顯示),CB來自於CA,且CB會對a改變。在CB對a改變的時候需要同時在CA的view上改變a嗎?答案是不需要,你在CA的viewWillAppear函數中根據a當前的值進行頁面刷新就可以了。

3.controller的view變量可以被賦值,但是你永遠也不要這麼做,否則後果不可預料。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章