0. iOS應用入口和AppDelegate數據結構
我最初開始iOS應用開發學習的時候,也沒有像樣的培訓和指導,第一個要看的就是代碼。咱們知道Objective-C也是基於C的,因而咱們找到了入口代碼main()函數。一般代碼以下:app
int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class])); } }
咱們看到返回類型、函數名和參數都很熟悉。至於函數體,除了AutoRelease是自動釋放池以外,執行的是一個名爲UIApplicationMain的函數調用,後兩個參數是nil(空)和一個MyAppDelegate類名字符串。函數
這個函數調用也就是這個iOS應用的開始,它進行了這個應用的初始化過程,並生成了一個類名爲MyAppDelegate的對象。至於MyAppDelegate這個名字,這裏只是一個示例,能夠爲其它命名,一般是應用統必定義的前綴+」AppDelegate」。這些都不重要,重要的是它實際上須要聽從於UIApplicationDelegate這個Protocol的定義,給出一些方法的實現。學習
那麼這個「AppDelegate」又是什麼呢?實際上,蘋果已經爲把每一個應用包裝成一個UIApplication對象,但應用每一步運行的細節並不須要開發者關注,只要關注這個應用對象對應的delegate便可,也就是這個「AppDelegate」。經過AppDelegate咱們能夠知道Application的運行狀態,發生了哪些事件。spa
1. 程序的5個狀態和對應的AppDelegate的7個方法線程
至於五個狀態,分別是:code
§ Not Running, 未運行orm
§ Inactive, 非活動對象
§ Active, 活動生命週期
§ Background, 後臺
§ Suspend, 掛起
對這5種狀態,這裏先不過多解釋,看下圖也許就會明白許多
從這個示意圖,咱們能夠看到哪些狀態間是能夠互相轉化的。而在這些狀態互相轉化的同時,AppDelegate中對應的生命週期方法會被調用:
// 進程啓動但還沒完成初始化,這個方法是iOS6以後纔有的 - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions // 進程啓動基本完成 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions // 應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件 - (void)applicationWillResignActive:(UIApplication *)application // 應用程序入活動狀態,這個恰好跟上面那個方法相反 - (void)applicationDidBecomeActive:(UIApplication *)application // 程序被推送到後臺,若是要設置後臺繼續運行,則在這個函數裏面設置便可 - (void)applicationDidEnterBackground:(UIApplication *)application // 程序從後臺將要回到前臺 - (void)applicationWillEnterForeground:(UIApplication *)application // 程序將要退出 - (void)applicationWillTerminate:(UIApplication *)application
2. 應用通常啓動過程
介紹了iOS應用的基本狀態和生命週期方法以後,再簡要對應用啓動和前臺狀態作一個整理說明。
對於通常的iOS應用來講,啓動以後是進入前臺運行的,大概的流程以下圖:
也就是說一般狀況下,應用程序啓動,圖中的三個方法會被依次調用到。
其中前兩個方法是咱們須要作一些初始化的地方,只在啓動時調用,然後面的BecomeActive方法會因程序中斷和先後臺切換屢次調用到。
對於一個簡單的應用,初始化主要作的事情就是把View和Controller初始化並結合起來。此外,必要的狀況下還要對傳入的Options參數進行解析處理,構建必要的數據結構。而按照官方文檔的要求,整個啓動過程須要在5秒鐘內完成,不然應用進程會因無響應的緣由被kill掉。所以,若是有其它任務須要執行,則應該開啓主線程以外的線程來進行,或者是推遲到以後更合適的實際來進行。
應用程序也有啓動後直接進入後臺運做的,這個能夠參看蘋果官方文檔說明。
3. 前臺運行的Active與Inactive
在介紹iOS應用狀態5種最基本的狀態時,咱們發現前臺運行有兩種狀態,分別是Inactive和Active狀態。大多數狀況下,Inactive狀態只是其它狀態之間切換時短暫的停留狀態,如先後臺應用切換時,Inactive狀態會在Active和Background之間短暫出現。
但也有一些其它狀況,Active和Inactive能夠在前臺運行時互相切換,好比當一個應用安裝運行後第一次嘗試使用GPS定位,須要獲取用戶的容許,給出系統的Alert提示,這時應用會從Active切換到Inactive,直到用戶確認後再返回Active。再如,用戶在應用運行時從狀態條向下拉出通知頁,也會發生Active和Inactive狀態的切換。此外,還有來電/拒絕接聽,以及App Switcher/回到原應用的操做等,都不進入Backgroud狀態,而只在Active與Inactive之間切換。
也就是說一般狀況下,應用程序啓動,圖中的三個方法會被依次調用到。
其中前兩個方法是咱們須要作一些初始化的地方,只在啓動時調用,然後面的BecomeActive方法會因程序中斷和先後臺切換屢次調用到。
對於一個簡單的應用,初始化主要作的事情就是把View和Controller初始化並結合起來。此外,必要的狀況下還要對傳入的Options參數進行解析處理,構建必要的數據結構。而按照官方文檔的要求,整個啓動過程須要在5秒鐘內完成,不然應用進程會因無響應的緣由被kill掉。所以,若是有其它任務須要執行,則應該開啓主線程以外的線程來進行,或者是推遲到以後更合適的實際來進行。
應用程序也有啓動後直接進入後臺運做的,這個能夠參看蘋果官方文檔說明。