iOS APP啟動流程

iOS APP啟動流程

做ios也有一段時間了匣摘,但是app的整個的啟動流程還似懂非懂全肮,看了許多的博客和資料熊响,在這里寫篇博客權(quán)當(dāng)總結(jié)筆記

在開始之前我們先看兩張啟動流程圖

圖一

示意圖一

<center>xcode4.2的啟動示意圖,不使用storyboarding</center>

圖二

示意圖二

<br /><br />
從上面兩張圖我們可以看出患朱,也是從main()函數(shù)開始轨功,iOS的面函數(shù)比較簡單就幾行代碼旭斥,只是調(diào)用UIApplicationMain函數(shù) ,這個函數(shù)如下

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

我們先來看一下UIApplicationMain的這幾個參數(shù):

  1. argc 表示參數(shù)個數(shù)
  2. argv 表示函數(shù)參數(shù)的數(shù)組
  3. 是UIApplication類名或者是其子類名,如果是nil古涧,則就默認(rèn)使用UIApplication類名
  4. 是協(xié)議UIApplicationDelegate的實例化對象名垂券,如果是nil,則從main nib文件中加載委托對象蒿褂。這個對象就是UIApplication對象監(jiān)聽到系統(tǒng)變化的時候通知其執(zhí)行的相應(yīng)方法
    此函數(shù)會創(chuàng)建一個UIApplication對象圆米,并根據(jù)第四個參數(shù)創(chuàng)建一個delegate對象,然后將此delegate對象賦值給UIApplication對象的delegate屬性啄栓。
    接著會建立應(yīng)用程序的Main Runloop循環(huán)娄帖,調(diào)用UIApplicationDelegate中的函數(shù)進(jìn)行事件處理

UIApplication

UiApplication代表一個應(yīng)用程序,每一個應(yīng)用程序都有一個UIApplication全局對象昙楚,而且這個對象是單例的近速,我們在程序中可以通過[UIApplication sharedApplication]獲得這個對象,進(jìn)行一些應(yīng)用級的操作堪旧。UIApplication是應(yīng)用程序的開始削葱,它維護了一個在本應(yīng)用程序中打開的Window列表,負(fù)責(zé)初始化顯示UIWindow淳梦,并負(fù)責(zé)加載應(yīng)用程序的第一個UIView到UIWindow窗口中析砸,在隨后的操作中,我們也可以更換UIWindow窗口的顯示內(nèi)容爆袍。此外首繁,UIApplication還被賦予一個代理對象作郭,在實際編程中,我們一般并不直接與UIApplication打交道弦疮,而是和其代理對象UIApplicationDelegate打交道夹攒,UIApplication負(fù)責(zé)監(jiān)聽接收事件,而由UIApplicationDelegate決定應(yīng)用程序如何去響應(yīng)這些事件(生命周期:程序啟動和關(guān)閉胁塞,系統(tǒng)事件:來電咏尝、記事項警告)等等。

UIApplicationDelegate

所有的移動操作系統(tǒng)都有個致命的缺點:app很容易受到打擾.比如一個來電或者鎖屏?xí)?dǎo)致app進(jìn)入后臺甚至被終止;還有很多其他類似的情況會導(dǎo)致app受到干擾,在app受到干擾時,會產(chǎn)生一些系統(tǒng)事件,這時UIApplication會通知它的delegate對象,讓delegate來處理這些系統(tǒng)事件.由圖二我們可以看到代理類可以處理許多事件
1.程序加載完畢
2.程序獲取焦點
3.程序進(jìn)入后臺
4.程序失去焦點
5.程序從后臺回到前臺
6.內(nèi)存不足警告
7.程序即將退出
</br>
程序中的AppDelegate.m都有相關(guān)的對應(yīng)函數(shù)

        #import "AppDelegate.h"
        @interface AppDelegate ()
        @end
        @implementation AppDelegate
        // 當(dāng)應(yīng)用程序啟動完畢的時候就會調(diào)用(系統(tǒng)自動調(diào)用)
        -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        //Override point for customization after application launch.
        return YES;
        }
        // 即將失去活動狀態(tài)的時候調(diào)用(失去焦點, 不可交互)
        -(void)applicationWillResignActive:(UIApplication *)application {
        }

        //應(yīng)用程序進(jìn)入后臺的時候調(diào)用
        // 一般在該方法中保存應(yīng)用程序的數(shù)據(jù), 以及狀態(tài)
        -(void)applicationDidEnterBackground:(UIApplication *)application {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        }

        // 應(yīng)用程序即將進(jìn)入前臺的時候調(diào)用
        // 一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)
        - (void)applicationWillEnterForeground:(UIApplication *)application {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
        }

        //重新獲取焦點(能夠和用戶交互)
        - (void)applicationDidBecomeActive:(UIApplication *)application {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        }

        // 應(yīng)用程序即將被銷毀的時候會調(diào)用該方法
        // 注意:如果應(yīng)用程序處于掛起狀態(tài)的時候無法調(diào)用該方法
         - (void)applicationWillTerminate:(UIApplication *)application {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:
        }

<strong>講到這里我們可以看出一個APP的完整的啟動流程</strong>:

1.main函數(shù)
2.執(zhí)行UIApplicationMain函數(shù)
  1.創(chuàng)建UIApplication對象
  2.創(chuàng)建UIApplicationDelegate對象并復(fù)制
  3.讀取配置文件info.plist啸罢,設(shè)置程序啟動的一些屬性编检,(關(guān)于info.plist的內(nèi)容我們下篇在講解)
  4.創(chuàng)建應(yīng)用程序的Main Runloop循環(huán)
3.UIApplicationDelegate對象開始處理監(jiān)聽到的事件
  1.程序啟動成功之后,首先調(diào)用<code>application:didFinishLaunchingWithOptions:</code>方法,
  如果info.plist文件中配置了啟動storyboard文件名伺糠,則加載storyboard文件蒙谓。
  如果沒有配置,則根據(jù)代碼來創(chuàng)建UIWindow--->UIWindow的rootViewController-->顯示
</br>

 -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
        //所要顯示的視圖控件
    LJTViewControler *LJTVC = [[LJTViewController alloc] init];
    self.window.rootViewController=LJTVC;
    [self.window makeKeyAndVisible];
    return YES;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末训桶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酣倾,更是在濱河造成了極大的恐慌舵揭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躁锡,死亡現(xiàn)場離奇詭異午绳,居然都是意外死亡,警方通過查閱死者的電腦和手機映之,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門拦焚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杠输,你說我怎么就攤上這事赎败。” “怎么了蠢甲?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵僵刮,是天一觀的道長。 經(jīng)常有香客問我鹦牛,道長搞糕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任曼追,我火速辦了婚禮窍仰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘礼殊。我一直安慰自己驹吮,他們只是感情好鲫忍,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钥屈,像睡著了一般悟民。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篷就,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天射亏,我揣著相機與錄音,去河邊找鬼竭业。 笑死智润,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的未辆。 我是一名探鬼主播窟绷,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咐柜!你這毒婦竟也來了兼蜈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拙友,失蹤者是張志新(化名)和其女友劉穎为狸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遗契,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡辐棒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牍蜂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漾根。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲫竞,靈堂內(nèi)的尸體忽然破棺而出辐怕,到底是詐尸還是另有隱情,我是刑警寧澤贡茅,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布秘蛇,位于F島的核電站,受9級特大地震影響顶考,放射性物質(zhì)發(fā)生泄漏赁还。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一驹沿、第九天 我趴在偏房一處隱蔽的房頂上張望艘策。 院中可真熱鬧,春花似錦渊季、人聲如沸朋蔫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驯妄。三九已至荷并,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間青扔,已是汗流浹背源织。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留微猖,地道東北人谈息。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像凛剥,于是被迫代替她去往敵國和親侠仇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 概要 進(jìn)入main函數(shù) 執(zhí)行UIApplicationMain函數(shù)創(chuàng)建UIApplication對象創(chuàng)建UIApp...
    NapoleonY閱讀 1,023評論 0 3
  • ========================程序的啟動原理==================== 一犁珠、 項目...
    不會打滾兒的獅子閱讀 525評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理逻炊,服務(wù)發(fā)現(xiàn),斷路器盲憎,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 1.程序入口main函數(shù)創(chuàng)建UIApplication實例和UIApplication代理實例嗅骄。 2.在UIApp...
    知本集閱讀 301評論 0 0
  • 熱鬧的春節(jié)過去了 親愛的同學(xué)們 也該收收心 發(fā)奮學(xué)習(xí)啦 如有調(diào)整窑眯,請以代課老師通知為準(zhǔn)。 另外医窿,我們應(yīng)各位家長的要...
    博煜教育隋老師閱讀 585評論 0 0