99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

細(xì)說iOS程序啟動(dòng)原理

發(fā)布時(shí)間:2016-09-04 22:42  回復(fù):0  查看:2467   最后回復(fù):2016-09-04 22:42  

當(dāng)剛開始學(xué)習(xí)ios開發(fā)的時(shí)候,我們學(xué)會(huì)做的第一件事就是創(chuàng)建一個(gè)新的項(xiàng)目。每次我都會(huì)好奇,為什么我們選擇創(chuàng)建一個(gè)Single View Application項(xiàng)目的時(shí)候,什么代碼都不用敲就可以在模擬器上運(yùn)行程序了。要解答這個(gè)問題需要明白一點(diǎn)程序的啟動(dòng)原理,看完之后你就會(huì)明白。

首先,建立一個(gè)Single View Application項(xiàng)目以方便我們的研究??梢悦鞔_的是,不論是C語(yǔ)言還是Objiective-C語(yǔ)言程序,程序運(yùn)行的入口都是main函數(shù)。所以我們從main函數(shù)開始入手。

細(xì)說iOS程序啟動(dòng)原理


創(chuàng)建新項(xiàng)目

細(xì)說iOS程序啟動(dòng)原理



main函數(shù)

看不懂這個(gè)main函數(shù)里面的代碼?

int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );

按住Option鍵點(diǎn)擊這個(gè)方法UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])),通過Apple的官方幫助文檔,我們來了解這個(gè)函數(shù)。
主要解析函數(shù)的后兩個(gè)參數(shù):


參數(shù)



說明



principalClassName



指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認(rèn)值



delegateClassName



指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議


總結(jié)一下這個(gè)函數(shù)的作用,按照運(yùn)行的過程,大概有四點(diǎn):

根據(jù)principalClassName實(shí)例化一個(gè)UIApplication類或其子類的對(duì)象,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將這個(gè)delegate對(duì)象賦值給UIApplicationd對(duì)象的delegate屬性。

接著會(huì)建立應(yīng)用程序的Main Runloop(事件循環(huán)),進(jìn)行事件的處理。

如果應(yīng)用的info.plist文件中,一個(gè)描述主nib文件里有關(guān)鍵字,且這個(gè)關(guān)鍵字對(duì)應(yīng)了可用的nib文件就加載這個(gè)文件。(如果沒有,就會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)

程序正常退出時(shí)UIApplicationMain函數(shù)才返回

什么是UIApplication?我們不糾結(jié),你需要知道的是,UIApplication對(duì)象是應(yīng)用程序的象征,所以每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象,而且是單例的(也就是說一個(gè)應(yīng)用中只有一個(gè)UIApplication對(duì)象),利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別的操作
。最重要的是,根據(jù)對(duì)main函數(shù)的研究,可以得出結(jié)論,UIApplication對(duì)象是程序創(chuàng)建的第一個(gè)對(duì)象!

重點(diǎn)來看這一條:

如果應(yīng)用的info.plist文件中,一個(gè)描述主nib文件里有關(guān)鍵字,且這個(gè)關(guān)鍵字對(duì)應(yīng)了可用的nib文件就加載這個(gè)文件。(如果沒有,就會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)

找到infp.plist文件,如圖,我們找到了main這個(gè)關(guān)鍵字。因?yàn)樗拇嬖?,我們的程序?huì)去加載main.storyboard這個(gè)文件,程序啟動(dòng)完成之后,我們就在模擬器的界面上看到了它白色的View。

細(xì)說iOS程序啟動(dòng)原理


Info.plist文件

如圖,假如我們刪掉這個(gè)main,其實(shí)就是刪掉了info.plist文件里面的main關(guān)鍵字。再運(yùn)行程序,你會(huì)發(fā)現(xiàn)你的模擬器黑洞洞一片,什么都沒有了。

細(xì)說iOS程序啟動(dòng)原理


把紅框框里的main刪掉!

那么,程序到這里到底是怎么運(yùn)行的呢?
注意上面那條括號(hào)里面的文字。如果你了解代理機(jī)制:成為了某個(gè)對(duì)象的代理,就要遵守它的代理協(xié)議,根據(jù)這份協(xié)議,就知道有些方法需要你去實(shí)現(xiàn)。這就是兩個(gè)AppDelegate文件的由來--原來他們就是來實(shí)現(xiàn)UIApplicationDelegate代理方法的??聪旅娴膱D,

細(xì)說iOS程序啟動(dòng)原理


AppDelegate.m文件里自動(dòng)生成的代理方法

我們已經(jīng)知道,當(dāng)應(yīng)用啟動(dòng)完成后會(huì)調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法,那么我們嘗試在這個(gè)方法里面寫一些代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.


    // 1.創(chuàng)建窗口

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];


    // 2.加載storyboard文件,創(chuàng)建控制器

    // name:就是storyboard文件名

    // bundle:bundle,傳入nil,表示主bundle

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];


    // 通過storyboard對(duì)象創(chuàng)建控制器

    // instantiateInitialViewController:加載storyboard箭頭指向的控制器

    UIViewController *rootVc = [storyboard instantiateInitialViewController];


    // 3.設(shè)置窗口的根控制器,并且顯示窗口

    self.window.rootViewController = rootVc;


    // 4.顯示窗口

    [self.window makeKeyAndVisible];


    return YES;

}

再重新運(yùn)行程序,你會(huì)發(fā)現(xiàn),你的模擬器界面又變白了。沒錯(cuò),你看到的還是main.storyboard文件里的控制器的view。也就是說,如果我們什么都不改變,Xcode會(huì)自動(dòng)幫我們生成這些代碼。暫時(shí)不要糾結(jié)這些代碼,讓你理解這整個(gè)流程是這篇文章的關(guān)鍵,相信會(huì)對(duì)你以后的學(xué)習(xí)帶來幫助。

最后:如果你還看不懂這些代碼?沒關(guān)系,這是我們繼續(xù)往后學(xué)習(xí)的關(guān)鍵,我會(huì)繼續(xù)寫一些相關(guān)的文字讓你了解。如果你是大神,感謝你花時(shí)間一拉到底到了這里。最后,或許我有理解不到位或者錯(cuò)誤的地方,歡迎大家批評(píng)指正。



原文來自:簡(jiǎn)書/加斯加的猿

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?