1. AppDelegate應(yīng)用程序代理
- 手機上的App有一個致命的缺點:很容易受到打擾。比如一個來電或者鎖屏?xí)?dǎo)致app進入后臺甚至被終止。
- 還有很多其它類似的情況會導(dǎo)致app受到干擾,在app受到干擾時,會產(chǎn)生一些系統(tǒng)事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統(tǒng)事件。作用:當(dāng)被打斷的時候,通知代理進入到后臺。
默認創(chuàng)建出來,有七個方法,解讀如下:
// 程序第一次加載完畢,就會調(diào)用此方法
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
// 程序?qū)⒁ソ裹c - 不能交互
- (void)applicationWillResignActive:(UIApplication*)application
// 程序已經(jīng)進入后臺,通常我們會在這個時候保存數(shù)據(jù)
- (void)applicationDidEnterBackground:(UIApplication*)application
// 程序?qū)⒁M入前臺,通常我們會在這個時候恢復(fù)數(shù)據(jù)
- (void)applicationWillEnterForeground:(UIApplication*)application
// 程序已經(jīng)獲取焦點 - 可以交互
- (void)applicationDidBecomeActive:(UIApplication*)application
// 程序掛了,將要完全退出。注意:1.用戶主動關(guān)閉 2.系統(tǒng)因為內(nèi)存不夠關(guān)閉了程序。
//這個里面最好不要做任何東西,因為很多時候都會是異常退出。不執(zhí)行這個。
- (void)applicationWillTerminate:(UIApplication*)application
// 程序接收到內(nèi)存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
2. UIApplicationMain函數(shù)/程序啟動過程
- main函數(shù)中執(zhí)行了一個UIApplicationMain這個函數(shù)
intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
2.1 啟動參數(shù)解釋
- argc 系統(tǒng)傳入?yún)?shù)的個數(shù)
- agrv 系統(tǒng)傳入?yún)?shù)的值列表
- principalClassName表示要創(chuàng)建的應(yīng)用程序?qū)ο?app的象征,該類必須是UIApplication或者它的字類)。如果傳nil默認就表示UIApplication類。
- delegateClassName表示 給應(yīng)用程序指定一個代理對象,該類必須遵守UIApplicationDelegate協(xié)議
2.2 啟動過程

Paste_Image.png
UIApplicationMain函數(shù)會根據(jù)principalClassName創(chuàng)建UIApplication對象,根據(jù)delegateClassName創(chuàng)建一個delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性接著會建立應(yīng)用程序的Main Runloop(事件循環(huán)),進行事件的處理(首先會在程序完畢后調(diào)用delegate對象的
application:didFinishLaunchingWithOptions:方法)程序正常退出時
UIApplicationMain函數(shù)才返回

Paste_Image.png
1.3 完整啟動過程
main函數(shù)
UIApplicationMain
- 創(chuàng)建UIApplication對象
- 創(chuàng)建UIApplication的delegate對象
-
delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
- 程序啟動完畢的時候, 就會調(diào)用代理的application:didFinishLaunchingWithOptions:方法
- 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口
根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
- 創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口