1. 程式人生 > >IOS 初級開發入門教程(三)探究應用及檢視的生命週期變化

IOS 初級開發入門教程(三)探究應用及檢視的生命週期變化

導讀

作業系統都會根據應用的生命週期狀態來管理和處理邏輯,這一點在Android開發上現的就已經非常好了,耳熟能詳的就是應用狀態影響記憶體回收級別和活動的生命週期。同樣,在IOS上也會充分利用應用的檢視的生命週期來進行管理應用。首先,我們先知道IOS應用在程式中的五種狀態及其變化,然後再去看IOS工程中有一個AppDelegate的類來動手驗證,它是應用程式的委託物件,(類似Android工程裡重寫Application類)在應用程式生命週期的不同階段會回撥不同的方法。
系列文章:

一、介紹應用生命週期


1、下列圖表概括,IOS應用的五種生命狀態  。
狀態名稱   狀態釋義
 
狀態描述

  Not running                     
    非活動狀態        應用沒有執行或被系統終止。
  Inactive
 前臺非活動狀態                       
  應用正在進入前臺狀態,但是還不能接受事件處理。
  Active  前臺活動狀態   應用進入前臺狀態,能接受事件處理。
  Background     後臺狀態

  應用進入後臺後,依然能執行程式碼。如果有可執行的程式碼,就會執行程式碼,如果沒有可執   行的程式碼或者將可執行的程式碼執行完畢,應用會馬上進入掛起狀態

  Suspended     掛起狀態

  應用處於掛起狀態,不能執行程式碼。若系統記憶體不夠,應用會被終止

 (注:這個圖表比較關鍵,務必熟背,且關鍵描述字)

2、利用思維導圖的方式,表示出IOS應用程式在前臺、後臺狀態轉變、生命週期的流程。

二、使用AppDelegate類回撥方法監聽

1、圖片展示 AppDelegate 類 的回撥方法,可用日誌列印驗證應用生命週期狀態的變化。(程式碼在下面) *補充:常用的列印NSLog格式如下。(可忽略)
%@ 物件
%d, %i 整數
%hi 短整型
%lli 長整型
%u   無符整形
%f 浮點/雙字
%0.2f  精度浮點數,且只保留兩位小數
%x, %X 二進位制整數
%o 八進位制整數
%zu size_t
%p 指標
%e   浮點/雙字 (科學計算)
%g   浮點/雙字  科學技術法(用最簡短的方式)
%s C (char*)字串
%.*s Pascal字串
%c 字元
%C unichar
%lld 64位長整數(long long)
%llu   無符64位長整數
%Lf 64位雙字
%lu   sizeof(i)記憶體中所佔位元組數
2、程式碼。標註AppDelegate類中各回調方法意義和作用介紹。
//  Created by aiyang on 2018/1/25.
//  Copyright © 2018年 aiyang. All rights reserved.

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //應用啟動並進行初始化時會呼叫該方法。這個階段會例項化根檢視控制器。
    NSLog(@"%s", "application:didFinishLaunchingWithOptions: Not runing -> Inactive");
    return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    //應用進入前臺非活動狀態時呼叫該方法。這個階段可以恢復UI的狀態。
    NSLog(@"%s","applicationDidBecomeActive: Inactive -> active");
}
- (void)applicationWillResignActive:(UIApplication *)application {
    //應用從活動狀態進入到非活動狀態時呼叫該方法。這個階段可以儲存UI的狀態。
      NSLog(@"%s", "applicationWillResignActive: active -> Inactive");
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
    //應用進入後臺或掛起時呼叫該方法。這個階段可以儲存使用者資料,釋放一些資源(例如釋放資料庫資源等)。
    NSLog(@"%s","applicationDidEnterBackground: Background -> Suspended");
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
    //應用從後臺再次回到前臺,但是還沒有處於活動狀態時呼叫該方法。這個階段可以恢復使用者資料。
    NSLog(@"%s","applicationWillEnterForeground: Suspended -> Background -> Inactive");
}
- (void)applicationWillTerminate:(UIApplication *)application {
    //應用被終止時呼叫該方法,但記憶體清除時除外。 這個階段釋放一些資源,也可以儲存使用者資料。
    NSLog(@"%s","applicationWillTerminate: Suspended -> Not runing");
}
@end

三、動手實踐-點選Home鍵

看到這裡,不得不再次提醒,前面內容很簡單、很基礎、也很重要,是ios開發者必知必背的知識。如果已經看懂了,但是還記不太牢固,那麼就跟著這個小練習看一遍來加深印象。 練習題:點選Home鍵,檢視應用宣告週期變化。
首先,我們要知道工程目錄有一個 Info.plist 檔案,其中屬性 Application does not run in background 可以控制應用後臺執行。如果找到不該屬性,可以通過Source Code XML形式自行寫入。將下面一條複製過去即可。
//設定支援後臺執行
<key>UIApplicationExitsOnSuspend</key>
<false/>
//設定不支援後臺執行
<key>UIApplicationExitsOnSuspend</key>
<true/>
配置引數檔案 info.plist ->Open As  有兩個選項:Property List ,視覺化列表形式(預設),Source Code 是XML形式。

然後,我們這裡先設定支援後臺執行,檢視列印結果:

TabbedApp[22498:1105773] application:didFinishLaunchingWithOptions: Not runing -> Inactive
TabbedApp[22498:1105773] applicationDidBecomeActive: Inactive -> active
TabbedApp[22498:1105773] applicationWillResignActive: active -> Inactive
TabbedApp[22498:1105773] applicationDidEnterBackground: Background -> Suspended
最後,再設定不支援後臺執行,檢視列印結果:
TabbedApp[22528:1107473] application:didFinishLaunchingWithOptions: Not runing -> Inactive
TabbedApp[22528:1107473] applicationDidBecomeActive: Inactive -> active
TabbedApp[22528:1107473] applicationWillResignActive: active -> Inactive
TabbedApp[22528:1107473] applicationDidEnterBackground: Background -> Suspended
TabbedApp[22528:1107473] applicationWillTerminate: Suspended -> Not runing

四、檢視的生命週期

檢視是應用的一個重要的組成部份,功能的實現與其息息相關,而檢視控制器控制著檢視,其重要性在整個應用中不言而喻。以檢視的四種狀態為基礎,我們來系統瞭解一下檢視控制器的生命週期。在檢視不同的生命週期中,檢視控制器會回撥不同的方法,具體如圖:


五、動手實踐-切換檢視監聽

這次,我們動手去查驗檢視的生命週期變化。這裡,拿上一章有一個小練習‘Tab切換’的工程拿來實踐。


圖片只是單純展示,建立預設工程,就這個樣子。有兩個.m的檢視檔案。(圖上紅線沒有資訊,可忽略)

然後,我們點選FirstViewController.m 、SecondViewController.m ,把生命週期回撥函式寫上並列印日誌輸出。如下:

//  Created by aiyang on 2018/1/25.
//  Copyright © 2018年 aiyang. All rights reserved.

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //  在檢視控制器已被例項化,檢視被載入到記憶體中時,會呼叫viewDidLoad方法,這時檢視並未出現。通常會對所控制的檢視進行初始化處理。
     NSLog(@"%s", "FirstView 檢視建立 :viewDidLoad");
}
- (void)viewWillAppear:(BOOL)animated{
     NSLog(@"%s", "FirstView 檢視可見 :viewWillAppear");
    
}
-(void)viewDidAppear:(BOOL)animated{
     NSLog(@"%s", "FirstView 檢視可見 :viewDidAppear");
    
}
-(void)viewDidDisappear:(BOOL)animated{
     [super viewDidDisappear:animated];
    NSLog(@"%s", "FirstView 檢視不可見 :viewDidDisappear");
}
-(void)viewWillDisappear:(BOOL)animated{
      NSLog(@"%s", "FirstView 檢視不可見 :viewWillDisappear");
    
}
- (void)didReceiveMemoryWarning {
    // 釋放記憶體,包括檢視控制器中的一些成員變數和檢視的釋放。
      NSLog(@"%s", "FirstView 系統低記憶體 :didReceiveMemoryWarning");
    [super didReceiveMemoryWarning];
}
-(void)viewDidUnload{
    NSLog(@"%s", "FirstView 系統低記憶體 :viewDidUnload");
    [super viewDidUnload];
    
}
@end
//  Created by aiyang on 2018/1/25.
//  Copyright © 2018年 aiyang. All rights reserved.
#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //  在檢視控制器已被例項化,檢視被載入到記憶體中時,會呼叫viewDidLoad方法,這時檢視並未出現。通常會對所控制的檢視進行初始化處理。
    NSLog(@"%s", "SecondView 檢視建立 :viewDidLoad");
}
- (void)viewWillAppear:(BOOL)animated{
    NSLog(@"%s", "SecondView 檢視可見 :viewWillAppear");
    
}
-(void)viewDidAppear:(BOOL)animated{
    NSLog(@"%s", "SecondView 檢視可見 :viewDidAppear");
    
}
-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"%s", "SecondView 檢視不可見 :viewDidDisappear");
}
-(void)viewWillDisappear:(BOOL)animated{
    NSLog(@"%s", "SecondView 檢視不可見 :viewWillDisappear");
    
}
- (void)didReceiveMemoryWarning {
    // 釋放記憶體,包括檢視控制器中的一些成員變數和檢視的釋放。
    NSLog(@"%s", "SecondView 系統低記憶體 :didReceiveMemoryWarning");
    [super didReceiveMemoryWarning];
}
-(void)viewDidUnload{
    NSLog(@"%s", "SecondView 系統低記憶體 :viewDidUnload");
    [super viewDidUnload];
}
@end
執行,啟動程式,可見第一次 列印結果:
TabbedApp[23162:1145440] application:didFinishLaunchingWithOptions: Not runing -> Inactive
TabbedApp[23162:1145440] FirstView 檢視建立 :viewDidLoad
TabbedApp[23162:1145440] FirstView 檢視可見 :viewWillAppear
TabbedApp[23162:1145440] FirstView 檢視可見 :viewDidAppear
TabbedApp[23162:1145440] applicationDidBecomeActive: Inactive -> active
我們再點選 Second 按鈕。

頁面切換後,可見 第二次列印結果:

TabbedApp[23208:1148352] SecondView 檢視建立 :viewDidLoad
TabbedApp[23208:1148352] SecondView 檢視可見 :viewWillAppear
TabbedApp[23208:1148352] FirstView  檢視不可見 :viewWillDisappear
TabbedApp[23208:1148352] FirstView  檢視不可見 :viewDidDisappear
TabbedApp[23208:1148352] SecondView 檢視可見 :viewDidAppear
然後,我們再次點選 First 按鈕,返回頁面。可見 第三次 列印結果:
TabbedApp[23208:1148352] FirstView  檢視可見 :  viewWillAppear
TabbedApp[23208:1148352] SecondView 檢視不可見 :viewWillDisappear
TabbedApp[23208:1148352] SecondView 檢視不可見 :viewDidDisappear
TabbedApp[23208:1148352] FirstView  檢視可見 :  viewDidAppear

六、結尾,送句話。

到這裡,相信小夥伴們應該已經掌握了IOS應用程式及檢視的生命週期的變化了。這個是非常基礎也非常重要,在日常開發中會經常用到它們去做程式碼邏輯處理及資源資料儲存及釋放。