程序啓動的完整過程:app
(1)main函數函數
(2)UIApplicationMainoop
* 建立UIApplication對象代理
* 建立UIApplication的delegate對象對象
(3)delegate對象開始處理(監聽)系統事件(沒有storyboard)事件
* 程序啓動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法ip
* 在application:didFinishLaunchingWithOptions:中建立UIWindowci
* 建立和設置UIWindow的rootViewControllerit
* 顯示窗口io
(3)根據Info.plist得到最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
* 建立UIWindow
* 建立和設置UIWindow的rootViewController
* 顯示窗口
(4)UIApplicationMain
main函數中執行了一個UIApplicationMain這個函數:
int UIApplicationMain(int argc, char *argv[], NSString
*principalClassName, NSString *delegateClassName);
各參數含義:
argc、argv:直接傳遞給UIApplicationMain進行相關處理便可。
principalClassName:指定應用程序類名(app的象徵),該類必須是UIApplication(或子類)。若是爲nil,則用UIApplication類做爲默認值。
delegateClassName:指定應用程序的代理類,該類必須遵照UIApplicationDelegate協議。
UIApplicationMain函數會根據principalClassName建立UIApplication對象,根據delegateClassName建立一個delegate對象,並將該delegate對象賦值給UIApplication對象中的delegate屬性。
接着會創建應用程序的Main Runloop(事件循環),進行事件的處理(首先會在程序完畢後調用delegate對象的application:didFinishLaunchingWithOptions:方法)。
程序正常退出時UIApplicationMain函數才返回。