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