點(diǎn)擊app的icon之后發(fā)生了什么

app的啟動(dòng)分為pre-main()main()兩個(gè)階段坦刀,本篇文章主要介紹main()函數(shù)發(fā)生了什么圃郊。

app_launch_fg.png

main()函數(shù)階段

每個(gè)C語言程序都是從main()函數(shù)開始的喳挑,Objective-C的程序也不例外裸诽。創(chuàng)建完新的iOS工程之后浦辨,系統(tǒng)會(huì)默認(rèn)為我們創(chuàng)建一個(gè)main.m文件蹬竖。main.m的代碼一般如下:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main()函數(shù)中只調(diào)用了一個(gè)函數(shù)UIApplicationMain(),接下來介紹一下UIApplicationMain()函數(shù)荤牍。

UIApplicationMain()函數(shù)

/**
 創(chuàng)建application及其代理案腺,創(chuàng)建事件循環(huán)

 @param argc argv中參數(shù)的數(shù)量
 @param argv 參數(shù)的列表
 @param principalClassName UIApplication類名或其子類名,nil默認(rèn)為UIApplication
 @param delegateClassName application delegate的類名康吵,如果從nib文件加載代理劈榨,則設(shè)為nil(不太理解)
 @return Never Return
 */
int UIApplicationMain(int argc, char * _Nonnull *argv, NSString *principalClassName, NSString *delegateClassName);

看一下UIApplicationMain()的官方文檔:

This function instantiates the application object from the principal class and instantiates the delegate (if any) from the given class and sets the delegate for the application. It also sets up the main event loop, including the application’s run loop, and begins processing events. If the application’s Info.plist file specifies a main nib file to be loaded, by including the NSMainNibFile key and a valid nib file name for the value, this function loads that nib file.
Despite the declared return type, this function never returns.

由此可知,UIApplicationMain()主要做了以下事情:

  • 首先晦嵌,創(chuàng)建UIApplication的單例同辣。每一個(gè)iOS應(yīng)用只有一個(gè)UIApplication對(duì)象拷姿,application主要負(fù)責(zé)用戶事件的分發(fā),它內(nèi)部維護(hù)了一個(gè)開放的window對(duì)象的列表旱函,可以通過這個(gè)列表追溯到app的任何一個(gè)view响巢。如果必須要在系統(tǒng)之前處理用戶事件,可以繼承UIApplication并且重寫sendEvent:sendAction:to:from:forEvent:方法棒妨。
  • 接著踪古,根據(jù)傳入的類名創(chuàng)建代理對(duì)象(也是單例),并且設(shè)置為UIApplication單例的代理券腔。代理遵守UIApplicationDelegate協(xié)議伏穆,對(duì)app的生命周期的重要事件做出響應(yīng),例如app的初始化纷纫,app狀態(tài)的切換和恢復(fù)枕扫,系統(tǒng)事件等。
  • 然后辱魁,創(chuàng)建主事件循環(huán)(包含application所需要用到的run loop)烟瞧,保證程序不退出,開始處理事件染簇。
  • 最后参滴,如果info.plist中設(shè)置了NSMainNibFile并且對(duì)應(yīng)的值有效,則會(huì)加載對(duì)應(yīng)的nib文件锻弓。

UIApplicationDelegate

UIApplicationMain()函數(shù)在完成上述的主要事情之后卵洗,會(huì)進(jìn)行第一次初始化,此時(shí)會(huì)回調(diào)UIApplicationDelegateapplication:willFinishLaunchingWithOptions:方法弥咪,這是開發(fā)者能夠編寫自定義代碼的第一個(gè)地方。
接下來會(huì)恢復(fù)UI狀態(tài)十绑,然后是最終的初始化聚至,此時(shí)會(huì)回調(diào)UIApplicationDelegateapplication:didFinishLaunchingWithOptions:方法,在這個(gè)方法中設(shè)置keyWindow本橙,并且創(chuàng)建根控制器扳躬。
以下為新建的空工程UIApplicationDelegate方法的執(zhí)行順序:

  • 啟動(dòng)程序
2018-06-14 02:40:17.954918+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate application:willFinishLaunchingWithOptions:]
2018-06-14 02:40:17.955391+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate application:didFinishLaunchingWithOptions:]
2018-06-14 02:40:17.968420+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidBecomeActive:]
  • 按Home鍵
2018-06-14 02:42:55.144510+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationWillResignActive:]
2018-06-14 02:42:55.726878+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidEnterBackground:]
  • 再次點(diǎn)擊icon
2018-06-14 02:43:34.248368+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationWillEnterForeground:]
2018-06-14 02:43:34.533594+0800 AppProgrammingDemo[54037:27963804] -[AppDelegate applicationDidBecomeActive:]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甚亭,隨后出現(xiàn)的幾起案子贷币,更是在濱河造成了極大的恐慌,老刑警劉巖亏狰,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件役纹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暇唾,警方通過查閱死者的電腦和手機(jī)促脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門辰斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘸味,你說我怎么就攤上這事宫仗。” “怎么了旁仿?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵藕夫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我枯冈,道長(zhǎng)毅贮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任霜幼,我火速辦了婚禮嫩码,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罪既。我一直安慰自己铸题,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布琢感。 她就那樣靜靜地躺著丢间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驹针。 梳的紋絲不亂的頭發(fā)上烘挫,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音柬甥,去河邊找鬼饮六。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苛蒲,可吹牛的內(nèi)容都是我干的卤橄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼臂外,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窟扑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漏健,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤嚎货,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蔫浆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殖属,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年克懊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忱辅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片七蜘。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墙懂,靈堂內(nèi)的尸體忽然破棺而出橡卤,到底是詐尸還是另有隱情,我是刑警寧澤损搬,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布碧库,位于F島的核電站,受9級(jí)特大地震影響巧勤,放射性物質(zhì)發(fā)生泄漏嵌灰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一颅悉、第九天 我趴在偏房一處隱蔽的房頂上張望沽瞭。 院中可真熱鬧,春花似錦剩瓶、人聲如沸驹溃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌鹤。三九已至,卻和暖如春枝缔,著一層夾襖步出監(jiān)牢的瞬間布疙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工愿卸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灵临,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓趴荸,卻偏偏與公主長(zhǎng)得像俱诸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赊舶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容