程式啟動的完整過程:
(1)main函數
(2)uiapplicationmain
* 建立uiapplication對象
* 建立uiapplication的delegate對象
(3)delegate對象開始處理(監聽)系統事件(沒有storyboard)
* 程式啟動完畢的時候, 就會調用代理的application:didfinishlaunchingwithoptions:方法
* 在application:didfinishlaunchingwithoptions:中建立uiwindow
* 建立和設定uiwindow的rootviewcontroller
* 顯示視窗
(3)根據info.plist獲得最主要storyboard的檔案名,加載最主要的storyboard(有storyboard)
* 建立uiwindow
(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函數才傳回。