main函數(shù)之前的底層環(huán)境搭建(代碼拷貝、內(nèi)存的開辟等操作系統(tǒng)相關(guān)的開啟一個進程)不再描述,我們從main函數(shù)開始。
1 main函數(shù)
int main(int argc, char * argv[]) { NSLog(@"===%s",argv[0]); @autoreleasepool { /// 函數(shù)原型: // int UIapplicationMain(int argc, char *argv[], NSString *PRincipalClassName, NSString *delegateClassName); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}
這里面的代碼一般是不變的。首先是一個自動釋放池,保證結(jié)束時內(nèi)存釋放,下面是參數(shù)介紹:
argc, argv:是標(biāo)C的參數(shù),argc為argv數(shù)組中元素的個數(shù)。argv一般有一個元素argv[0]即當(dāng)前可執(zhí)行程序的路徑。(另外,在linux系統(tǒng)下我們通過終端打開一個程序可以給它傳遞參數(shù),具體不再展開。如果不知所云括號里面的自動忽略);
principalClassName:指定應(yīng)用程序類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值,它是一個單例,代表一個進程,也是程序創(chuàng)建的第一個對象,利用UIApplication對象,能進行一些應(yīng)用級別的操作;
delegateClassName:指定應(yīng)用程序類的代理類,該類必須遵守UIApplicationDelegate協(xié)議。
2 UIApplicationMain
1)根據(jù)傳進的參數(shù)創(chuàng)建UIApplication對象;
2)根據(jù)傳進的參數(shù)創(chuàng)建UIApplication的delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性。
3)開啟一個消息循環(huán)
下面分為storyboard啟動和沒有storyboard啟動
##有storyboard##
3 根據(jù)Info.plist加載storyboard
1)創(chuàng)建UIWindow,UIWindow是一種特殊的UIView,通常在一個App中只會有一個UIWindow(注意是通常,還有其它的,比如彈出的鍵盤)。設(shè)置為主窗口,同一時刻主窗口只有一個,可以通過[UIApplication sharedApplication].keyWindow獲取。
2)創(chuàng)建和設(shè)置UIWindow的rootViewController。
3)顯示窗口
##沒有storyboard##
3 delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
1)程序啟動完畢的時候, 就會調(diào)用代理的application:didFinishLaunchingWithOptions:方法
2)在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow:window
3)創(chuàng)建和設(shè)置UIWindow的rootViewController
4)顯示并設(shè)置window為主窗口:[window makeKeyAndVisible]; 然后self.window = window;防止被釋放。
新聞熱點
疑難解答