App的生命週期

iOS程序的啓動執行順序

程序啓動順序圖 bash

iOS啓動原理圖

具體執行流程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 + SHIFTui

-[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相關操做,ViewloadView方法中才初始化。cdn

  • initWithCoder: 若是使用StoryBoard進行視圖管理,程序不會直接初始化一個UIViewControllerStoryBoard會自動初始化或在segue被觸發時自動初始化,所以方法initWithNibName:bundle不會被調用,可是initWithCoder會被調用。對象

  • awakeFromNibawakeFromNib方法被調用時,全部視圖的outletaction已經鏈接,但尚未被肯定,這個方法能夠算做適合視圖控制器的實例化配合一塊兒使用的,由於有些須要根據用戶喜愛來進行設置的內容,沒法存在storyBoardxib中,因此能夠在awakeFromNib方法中被加載進來。blog

  • loadView 當執行到loadView方法時,若是視圖控制器是經過nib建立,那麼視圖控制器已經從nib文件中被解檔並建立好了,接下來任務就是對view進行初始化。 loadView方法在UIViewController對象的view被訪問且爲空的時候調用。這是它與awakeFromNib方法的一個區別。 假設咱們在處理內存警告時釋放view屬性:self.view = nil。所以loadView方法在視圖控制器的生命週期內可能被調用屢次。 loadView方法不該該直接被調用,而是由系統調用,它會加載或建立一個view並把它賦值給UIViewControllerview屬性。 在建立view的過程當中,首先會根據nibName去找對應的nib文件而後加載。若是nibName爲空或找不到對應的nib文件,則會建立一個空視圖(這種狀況通常是純代碼) 注意:在重寫loadView方法的時候,不要調用父類的方法。

  • viewDidLoadloadViewview載入內存中,會進一步調用viewDidLoad方法來進行進一步設置。此時,視圖層次已經放到內存中,一般,咱們對於各類初始化數據的載入,初始設定、修改約束、移除視圖等不少操做均可以這個方法中實現。

  • viewWillAppear 系統在載入全部的數據後,將會在屏幕上顯示視圖,這時會先調用這個方法,一般咱們會在這個方法對即將顯示的視圖作進一步的設置。好比,設置設備不一樣方向時該如何顯示;設置狀態欄方向、設置視圖顯示樣式等。 另外一方面,當APP有多個視圖時,上下級視圖切換是也會調用這個方法,若是在調入視圖時,須要對數據作更新,就只能在這個方法內實現。

  • viewWillLayoutSubviews view即將佈局其Subviews。 好比viewbounds改變了(例如:狀態欄從不顯示到顯示,視圖方向變化),要調整Subviews的位置,在調整以前要作的工做能夠放在該方法中實現

  • viewDidLayoutSubviews view已經佈局其Subviews,這裏能夠放置調整完成以後須要作的工做。

  • viewDidAppearview被添加到視圖層級中以及多視圖,上下級視圖切換時調用這個方法,在這裏能夠對正在顯示的視圖作進一步的設置。

  • viewWillDisappear 在視圖切換時,當前視圖在即將被移除、或被覆蓋是,會調用該方法,此時尚未調用removeFromSuperview

  • viewDidDisappear view已經消失或被覆蓋,此時已經調用removeFromSuperView;

  • dealloc 視圖被銷燬,這次須要對你在initviewDidLoad中建立的對象進行釋放。

  • didReceiveMemoryWarning 在內存足夠的狀況下,app的視圖一般會一直保存在內存中,可是若是內存不夠,一些沒有正在顯示的viewController就會收到內存不足的警告,而後就會釋放本身擁有的視圖,以達到釋放內存的目的。可是系統只會釋放內存,並不會釋放對象的全部權,因此一般咱們須要在這裏將不須要顯示在內存中保留的對象釋放它的全部權,將其指針置nil。

相關文章
相關標籤/搜索