iOS四大對象之AppDelegate及UIApplicationMain函數(shù)/程序啟動過程

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 完整啟動過程

  1. main函數(shù)

  2. UIApplicationMain

  • 創(chuàng)建UIApplication對象
  • 創(chuàng)建UIApplication的delegate對象
  1. delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)

    • 程序啟動完畢的時候, 就會調(diào)用代理的application:didFinishLaunchingWithOptions:方法
    • 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
    • 創(chuàng)建和設(shè)置UIWindow的rootViewController
    • 顯示窗口
  2. 根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)

  • 創(chuàng)建UIWindow
  • 創(chuàng)建和設(shè)置UIWindow的rootViewController
  • 顯示窗口
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容