iOS 視圖UIViewController的生命周期

iOS 視圖UIViewController的生命周期

huanglinxiao 2019-02-22 11:22:24 1053 收藏 2
分類專欄: iOS那些事 文章標簽: UIViewController 生命周期
版權(quán)
1.initWithNibName:bundle:

初始化UIViewController,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作,非StoryBoard創(chuàng)建UIViewController都會調(diào)用這個方法。

** 注意: 不要在這里做View相關(guān)操作,View在loadView方法中才初始化。**

  1. initWithCoder:

如果使用StoryBoard進行視圖管理,程序不會直接初始化一個UIViewController,StoryBoard會自動初始化或在segue被觸發(fā)時自動初始化,因此方法initWithNibName:bundle不會被調(diào)用,但是initWithCoder會被調(diào)用。

  1. awakeFromNib

當awakeFromNib方法被調(diào)用時,所有視圖的outlet和action已經(jīng)連接,但還沒有被確定,這個方法可以算作適合視圖控制器的實例化配合一起使用的,因為有些需要根據(jù)用戶喜好來進行設(shè)置的內(nèi)容,無法存在storyBoard或xib中,所以可以在awakeFromNib方法中被加載進來。

  1. loadView

當執(zhí)行到loadView方法時,如果視圖控制器是通過nib創(chuàng)建,那么視圖控制器已經(jīng)從nib文件中被解檔并創(chuàng)建好了,接下來任務(wù)就是對view進行初始化。

loadView方法在UIViewController對象的view被訪問且為空的時候調(diào)用。這是它與awakeFromNib方法的一個區(qū)別。

假設(shè)我們在處理內(nèi)存警告時釋放view屬性:self.view = nil。因此loadView方法在視圖控制器的生命周期內(nèi)可能被調(diào)用多次。

loadView方法不應(yīng)該直接被調(diào)用,而是由系統(tǒng)調(diào)用。它會加載或創(chuàng)建一個view并把它賦值給UIViewController的view屬性。

在創(chuàng)建view的過程中,首先會根據(jù)nibName去找對應(yīng)的nib文件然后加載。如果nibName為空或找不到對應(yīng)的nib文件,則會創(chuàng)建一個空視圖(這種情況一般是純代碼)

注意:在重寫loadView方法的時候,不要調(diào)用父類的方法。

  1. viewDidLoad

當loadView將view載入內(nèi)存中,會進一步調(diào)用viewDidLoad方法來進行進一步設(shè)置。此時,視圖層次已經(jīng)放到內(nèi)存中,通常,我們對于各種初始化數(shù)據(jù)的載入,初始設(shè)定、修改約束、移除視圖等很多操作都可以這個方法中實現(xiàn)。

視圖層次(view hierachy):因為每個視圖都有自己的子視圖,這個視圖層次其實也可以理解為一顆樹狀的數(shù)據(jù)結(jié)構(gòu)。而樹的根節(jié)點,也就是根視圖(root view),在UIViewController中以view屬性。它可以看做是其他所有子視圖的容器,也就是根節(jié)點。

  1. viewWillAppear

系統(tǒng)在載入所有的數(shù)據(jù)后,將會在屏幕上顯示視圖,這時會先調(diào)用這個方法,通常我們會在這個方法對即將顯示的視圖做進一步的設(shè)置。比如,設(shè)置設(shè)備不同方向時該如何顯示;設(shè)置狀態(tài)欄方向、設(shè)置視圖顯示樣式等。

另一方面,當APP有多個視圖時,上下級視圖切換是也會調(diào)用這個方法,如果在調(diào)入視圖時,需要對數(shù)據(jù)做更新,就只能在這個方法內(nèi)實現(xiàn)。

  1. viewWillLayoutSubviews

view即將布局其Subviews。 比如view的bounds改變了(例如:狀態(tài)欄從不顯示到顯示,視圖方向變化),要調(diào)整Subviews的位置,在調(diào)整之前要做的工作可以放在該方法中實現(xiàn)

8.viewDidLayoutSubviews

view已經(jīng)布局其Subviews,這里可以放置調(diào)整完成之后需要做的工作。

  1. viewDidAppear

在view被添加到視圖層級中以及多視圖,上下級視圖切換時調(diào)用這個方法,在這里可以對正在顯示的視圖做進一步的設(shè)置。

10.viewWillDisappear

在視圖切換時,當前視圖在即將被移除、或被覆蓋是,會調(diào)用該方法,此時還沒有調(diào)用removeFromSuperview。

  1. viewDidDisappear

view已經(jīng)消失或被覆蓋,此時已經(jīng)調(diào)用removeFromSuperView;

  1. dealloc

視圖被銷毀,此次需要對你在init和viewDidLoad中創(chuàng)建的對象進行釋放。

13.didReceiveMemoryWarning

在內(nèi)存足夠的情況下,app的視圖通常會一直保存在內(nèi)存中,但是如果內(nèi)存不夠,一些沒有正在顯示的viewController就會收到內(nèi)存不足的警告,然后就會釋放自己擁有的視圖,以達到釋放內(nèi)存的目的。但是系統(tǒng)只會釋放內(nèi)存,并不會釋放對象的所有權(quán),所以通常我們需要在這里將不需要顯示在內(nèi)存中保留的對象釋放它的所有權(quán),將其指針置nil。

視圖的生命歷程

[ViewController initWithCoder:]或[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對象。即使是純代碼,也會把nil作為參數(shù)傳給后者。

[ViewController viewDidLoad]:此時整個視圖層次(view hierarchy)已經(jīng)放到內(nèi)存中,可以移除一些視圖,修改約束,加載數(shù)據(jù)等。

[ViewController viewWillLayoutSubviews]即將開始子視圖位置布局

[ViewController viewDidLayoutSubviews]用于通知視圖的位置布局已經(jīng)完成

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容