1. 程式人生 > >iOS-關於應用/檢視的生命週期及程式啟動原理小結

iOS-關於應用/檢視的生命週期及程式啟動原理小結

前言:

  所有的移動作業系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止

  還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate物件,讓delegate代理來處理這些系統事件

delegate可處理的事件包括:

  • 應用程式的生命週期事件(如程式啟動和關閉)
  • 系統事件(如來電)
  • 記憶體警告
應用的生命週期--->啟動過程:

應用啟動過程


這些UIApplicationDelegate,監聽應用程式的生命週期,監聽記憶體警告,系統事件

  • // 當應用程式啟動完畢的時候就會呼叫 (系統自動呼叫)

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
       NSLog(@"%s",__func__);
    
       return YES;
    }
  • // 即將失去活動狀態的時候呼叫(失去焦點, 不可互動)

    - (void)applicationWillResignActive:(UIApplication *)application {
    
        NSLog(@"%s",__func__);
    
    }
  • // 應用程式即將進入前臺的時候呼叫
    // 一般在該方法中恢復應用程式的資料,以及狀態

    - (void)applicationWillEnterForeground:(UIApplication *)application    {
    
        NSLog(@"%s",__func__);
    
    }
  • // 應用程式進入後臺的時候呼叫
    // 一般在該方法中儲存應用程式的資料, 以及狀態
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
         NSLog(@"Background");
     }
  • // 重新獲取焦點(能夠和使用者互動)

    - (void)applicationDidBecomeActive:(UIApplication *)
    application { NSLog(@"%s",__func__); }
  • // 應用程式即將被銷燬的時候會呼叫該方法
    // 注意:如果應用程式處於掛起狀態的時候無法呼叫該方法

    - (void)applicationWillTerminate:(UIApplication *)application {
    
      }
  • // 應用程式接收到記憶體警告的時候就會呼叫
    // 一般在該方法中釋放掉不需要的記憶體

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
    
    {
    
        NSLog(@"%s",__func__);
    
    }

    應用程式一般有五個狀態:官方文件app.states

程式啟動生命週期:--> (啟動過程)

A篇:啟動原理 
① 執行main 函式,呼叫 main 函式裡的 UIApplicationMain 函式。

intUIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName);

  • argc、argv:直接傳遞給UIApplicationMain進行相關處理即可
  • principalClassName:指定應用程式類名(app的象徵),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值
  • delegateClassName:指定應用程式的代理類,該類必須遵守UIApplicationDelegate協議

② UIApplicationMain函式會根據principalClassName建立UIApplication物件,根據delegateClassName建立一個delegate物件,並將該delegate物件賦值給UIApplication物件中的delegate屬性

③ 接著會建立應用程式的Main Runloop(事件迴圈),進行事件的處理(首先會在程式完畢後呼叫delegate物件的application:didFinishLaunchingWithOptions:方法)

④ 程式正常退出時UIApplicationMain函式才返回

  • 系統入口的程式碼和引數說明:

     argc:系統或者使用者傳入的引數
     argv:系統或使用者傳入的實際引數
    
     1.根據傳入的第三個引數,建立UIApplication物件
     2.根據傳入的第四個產生建立UIApplication物件的代理
     3.設定剛剛創建出來的代理物件為UIApplication的代理
     4.開啟一個事件迴圈(可以理解為裡面是一個死迴圈)這個時間迴圈是一個佇列(先進先出)先新增進去的先處理


    B篇:(完整啟動過程)

1.執行main 函式,呼叫 main 函式裡的 UIApplicationMain 函式。

2.建立UIApplication
① 開啟網頁,發簡訊,打電話
② 設定應用程式提醒數字
③ 設定聯網狀態
④ 設定狀態列

3.建立AppDelegate代理物件,並且成為AppDelegate代理
① 監聽整個App的生命週期
② 處理記憶體警告

4.開啟主運迴圈,保證程式一直執行
① 每一個執行緒都有runloop
② 主執行緒有一個runloop

5.載入info.plist (判斷是否載入了main.storyboard)

  • 情況1:--> 如果指定(沒有storyboard)
    就會在application:didFinishLaunchingWithOptions:中
    ① 建立視窗
    ② 設定根控制器
    ③ 顯示視窗

  • 情況2:--> 如果載入的Info.plist檔案裡的Main storyboard:
    系統會自動呼叫 (不用我們管)
    ① 建立視窗
    ② 載入main.storyboard,並且載入main.storyboard指定的控制器
    ③ 把新建立的控制器,作為視窗的根控制器,讓視窗顯示出來


    如圖:


    程式啟動過程
檢視的生命週期--->view:

檢視的生命週期
  • 1、 alloc 建立物件,分配空間
  • 2、 init (initWithNibName) 初始化物件,初始化資料
  • 3、 loadView 從nib載入檢視 ,除非你沒有使用xib檔案建立檢視
  • 4、 viewDidLoad 載入完成,可以進行自定義資料以及動態建立其他控制元件
  • 5、 viewWillAppear檢視將出現在螢幕之前,馬上這個檢視就會被展現在螢幕上了
  • 6、 viewDidAppear 檢視已在螢幕上渲染完成
  • 7、viewWillDisappear 檢視將被從螢幕上移除之前執行
  • 8、viewDidDisappear 檢視已經被從螢幕上移除,使用者看不到這個檢視了
  • 9、dealloc 檢視被銷燬,此處需要對你在init和viewDidLoad中建立的物件進行釋放.
  • 10、viewVillUnload- 當記憶體過低,即將釋放時呼叫;
  • 11、viewDidUnload-當記憶體過低,釋放一些不需要的檢視時呼叫。