程序啓動順序圖 bash
具體執行流程app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"--- %s ---",__func__);//__func__打印方法名
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"--- %s ---",__func__);
}
複製代碼
啓動程序佈局
-[AppDelegate application:didFinishLaunchingWithOptions:]
-[AppDelegate applicationDidBecomeActive:]
複製代碼
按下 Command + H + SHIFT
ui
-[AppDelegate applicationWillResignActive:]
-[AppDelegate applicationDidEnterBackground:]
複製代碼
從新點擊 進入程序spa
-[AppDelegate applicationWillEnterForeground:]
-[AppDelegate applicationDidBecomeActive:]
複製代碼
內存警告指針
-[AppDelegate applicationDidReceiveMemoryWarning:]
複製代碼
UIViewController
的生命週期// 非storyBoard(xib或非xib)都走這個方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
return self;
}
// storyBoard走這個方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithCoder:aDecoder]) {
}
return self;
}
// xib 加載 完成
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"%s", __FUNCTION__);
}
// 加載視圖(默認從nib)
- (void)loadView {
NSLog(@"%s", __FUNCTION__);
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor redColor];
}
// 視圖控制器中的視圖加載完成,viewController自帶的view加載完成
- (void)viewDidLoad {
NSLog(@"%s", __FUNCTION__);
[super viewDidLoad];
}
// 視圖將要出現
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillAppear:animated];
}
// view 即將佈局其 Subviews
- (void)viewWillLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewWillLayoutSubviews];
}
// view 已經佈局其 Subviews
- (void)viewDidLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewDidLayoutSubviews];
}
// 視圖已經出現
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidAppear:animated];
}
// 視圖將要消失
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillDisappear:animated];
}
// 視圖已經消失
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidDisappear:animated];
}
// 出現內存警告
- (void)didReceiveMemoryWarning {
NSLog(@"%s", __FUNCTION__);
[super didReceiveMemoryWarning];
}
// 視圖被銷燬
- (void)dealloc {
NSLog(@"%s", __FUNCTION__);
}
複製代碼
分析code
initWithNibName:bundle:
初始化UIViewController
,執行關鍵數據初始化操做,非StoryBoard
建立UIViewController
都會調用這個方法。 注意: 不要在這裏作View
相關操做,View
在loadView
方法中才初始化。cdn
initWithCoder:
若是使用StoryBoard
進行視圖管理,程序不會直接初始化一個UIViewController
,StoryBoard
會自動初始化或在segue
被觸發時自動初始化,所以方法initWithNibName:bundle
不會被調用,可是initWithCoder
會被調用。對象
awakeFromNib
當awakeFromNib
方法被調用時,全部視圖的outlet
和action
已經鏈接,但尚未被肯定,這個方法能夠算做適合視圖控制器的實例化配合一塊兒使用的,由於有些須要根據用戶喜愛來進行設置的內容,沒法存在storyBoard
或xib
中,因此能夠在awakeFromNib
方法中被加載進來。blog
loadView
當執行到loadView
方法時,若是視圖控制器是經過nib
建立,那麼視圖控制器已經從nib
文件中被解檔並建立好了,接下來任務就是對view
進行初始化。 loadView
方法在UIViewController
對象的view
被訪問且爲空的時候調用。這是它與awakeFromNib
方法的一個區別。 假設咱們在處理內存警告時釋放view
屬性:self.view = nil
。所以loadView
方法在視圖控制器的生命週期內可能被調用屢次。 loadView
方法不該該直接被調用,而是由系統調用,它會加載或建立一個view
並把它賦值給UIViewController
的view
屬性。 在建立view
的過程當中,首先會根據nibName
去找對應的nib
文件而後加載。若是nibName
爲空或找不到對應的nib文件,則會建立一個空視圖(這種狀況通常是純代碼) 注意:在重寫loadView方法的時候,不要調用父類的方法。
viewDidLoad
當loadView
將view
載入內存中,會進一步調用viewDidLoad
方法來進行進一步設置。此時,視圖層次已經放到內存中,一般,咱們對於各類初始化數據的載入,初始設定、修改約束、移除視圖等不少操做均可以這個方法中實現。
viewWillAppear
系統在載入全部的數據後,將會在屏幕上顯示視圖,這時會先調用這個方法,一般咱們會在這個方法對即將顯示的視圖作進一步的設置。好比,設置設備不一樣方向時該如何顯示;設置狀態欄方向、設置視圖顯示樣式等。 另外一方面,當APP有多個視圖時,上下級視圖切換是也會調用這個方法,若是在調入視圖時,須要對數據作更新,就只能在這個方法內實現。
viewWillLayoutSubviews
view
即將佈局其Subviews
。 好比view
的bounds
改變了(例如:狀態欄從不顯示到顯示,視圖方向變化),要調整Subviews
的位置,在調整以前要作的工做能夠放在該方法中實現
viewDidLayoutSubviews
view
已經佈局其Subviews
,這裏能夠放置調整完成以後須要作的工做。
viewDidAppear
在view
被添加到視圖層級中以及多視圖,上下級視圖切換時調用這個方法,在這裏能夠對正在顯示的視圖作進一步的設置。
viewWillDisappear
在視圖切換時,當前視圖在即將被移除、或被覆蓋是,會調用該方法,此時尚未調用removeFromSuperview
。
viewDidDisappear
view
已經消失或被覆蓋,此時已經調用removeFromSuperView
;
dealloc
視圖被銷燬,這次須要對你在init
和viewDidLoad
中建立的對象進行釋放。
didReceiveMemoryWarning
在內存足夠的狀況下,app的視圖一般會一直保存在內存中,可是若是內存不夠,一些沒有正在顯示的viewController就會收到內存不足的警告,而後就會釋放本身擁有的視圖,以達到釋放內存的目的。可是系統只會釋放內存,並不會釋放對象的全部權,因此一般咱們須要在這裏將不須要顯示在內存中保留的對象釋放它的全部權,將其指針置nil。