iOS程序的啟動(dòng)順序
-
程序入口
進(jìn)入main函數(shù)衡便,設(shè)置AppDelegate為函數(shù)的代理
程序完成加載
[AppDelegate application:didFinishLaunchingWithOptions:]
- 創(chuàng)建window窗口
- 程序被激活
[AppDelegate applicationDidBecomeActive:]
-
當(dāng)點(diǎn)擊home將程序掛到后臺(tái)的時(shí)候
程序取消激活狀態(tài) 程序進(jìn)入后臺(tái)
[AppDelegate applicationWillResignActive:];
[AppDelegate applicationDidEnterBackground:];
-
當(dāng)再次點(diǎn)擊app圖標(biāo)進(jìn)入工程時(shí)
程序進(jìn)入前臺(tái) 程序被激活
[AppDelegate applicationWillEnterForeground:];[AppDelegate applicationWillEnterForeground:];
[AppDelegate applicationDidBecomeActive:];
UIViewController的生命周期
函數(shù)方法執(zhí)行順序如下
- 非storyBoard(xib或非xib)都走這個(gè)方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- 如果連接了串聯(lián)圖storyBoard 走這個(gè)方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
- xib 加載 完成(無論是storyBoard還是其他方式都會(huì)走這個(gè)方法)
- (void)awakeFromNib
- 加載視圖(默認(rèn)從nib)
- (void)loadView
- 視圖控制器中的視圖加載完成,viewController自帶的view加載完成
- (void)viewDidLoad
- 視圖將要出現(xiàn)
- (void)viewWillAppear:(BOOL)animated
- view 即將布局其 Subviews
- (void)viewWillLayoutSubviews
- view 已經(jīng)布局其 Subviews
- (void)viewDidLayoutSubviews
- 視圖已經(jīng)出現(xiàn)
- (void)viewDidAppear:(BOOL)animated
- 視圖將要消失
- (void)viewWillDisappear:(BOOL)animated
- 視圖已經(jīng)消失
- (void)viewDidDisappear:(BOOL)animated
- 出現(xiàn)內(nèi)存警告
- (void)didReceiveMemoryWarning
- 視圖被銷毀
- (void)dealloc
詳解
loadView
當(dāng)執(zhí)行到loadView方法時(shí)苫拍,如果視圖控制器是通過nib創(chuàng)建艇纺,那么視圖控制器已經(jīng)從nib文件中被解檔并創(chuàng)建好了芦瘾,接下來任務(wù)就是對(duì)view進(jìn)行初始化拳球。
loadView方法在UIViewController對(duì)象的view被訪問且為空的時(shí)候調(diào)用。這是它與awakeFromNib方法的一個(gè)區(qū)別。
假設(shè)我們?cè)谔幚韮?nèi)存警告時(shí)釋放view屬性:self.view = nil雏节。因此loadView方法在視圖控制器的生命周期內(nèi)可能被調(diào)用多次胜嗓。
loadView方法不應(yīng)該直接被調(diào)用,而是由系統(tǒng)調(diào)用钩乍。它會(huì)加載或創(chuàng)建一個(gè)view并把它賦值給UIViewController的view屬性辞州。
在創(chuàng)建view的過程中,首先會(huì)根據(jù)nibName去找對(duì)應(yīng)的nib文件然后加載寥粹。如果nibName為空或找不到對(duì)應(yīng)的nib文件变过,則會(huì)創(chuàng)建一個(gè)空視圖(這種情況一般是純代碼)
注意:在重寫loadView方法的時(shí)候,不要調(diào)用父類的方法涝涤。
viewDidDisappear
view已經(jīng)消失或被覆蓋媚狰,此時(shí)已經(jīng)調(diào)用removeFromSuperView
視圖的生命周期
- [ViewController initWithCoder:]或[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對(duì)象。即使是純代碼阔拳,也會(huì)把nil作為參數(shù)傳給后者崭孤。
- awakeFromNib:作為第一個(gè)方法的助手,方法處理一些額外的設(shè)置糊肠。
- loadView:創(chuàng)建或加載一個(gè)view并把它賦值給UIViewController的view屬性辨宠。
- viewDidLoad此時(shí)整個(gè)視圖層次(view hierarchy)已經(jīng)放到內(nèi)存中,可以移除一些視圖货裹,修改約束嗤形,加載數(shù)據(jù)等。
- viewWillAppear:視圖加載完成弧圆,并即將顯示在屏幕上赋兵。還沒設(shè)置動(dòng)畫,可以改變當(dāng)前屏幕方向或狀態(tài)欄的風(fēng)格等搔预。
- viewWillLayoutSubviews即將開始子視圖位置布局
- viewDidLayoutSubviews用于通知視圖的位置布局已經(jīng)完成
- viewDidAppear:視圖已經(jīng)展示在屏幕上霹期,可以對(duì)視圖做一些關(guān)于展示效果方面的修改。
- viewWillDisappear:視圖即將消失
- viewDidDisappear:視圖已經(jīng)消失
- dealloc:視圖銷毀的時(shí)候調(diào)用