根據以上兩張圖片來看,app的啓動過程以下:微信
一、打開app,調用main函數app
二、main調用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))ide
第三個參數nil:表明UIApplication類名或者子類名稱,nil 至關於 @"UIApplicaiton"
;
第四個參數:表明UIApplicaiton的代理名稱NSStringFromClass([AppDelegate class] 至關於 @"AppDelegate"
;函數
2.一、UIApplicationMain建立UIApplication對象,AppDelegate對象(UIApplication的代理)oop
2.二、UIApplication開啓運行循環(Main Runloop)ui
注:UiApplication表明一個應用程序,每個應用程序都有一個UIApplication全局對象(單例),咱們在程序中能夠經過[UIApplication sharedApplication]
得到這個對象,進行一些應用級的操做。UIApplication負責監聽接收事件,而由UIApplicationDelegate決定應用程序如何去響應這些事件(生命週期:程序啓動和關閉,系統事件:來電、記事項警告)等等。spa
2.三、加載info.plist,判斷是否指定mian(xib或者storyboard)若是指定就去加載代理
三、UIApplicationDelegate對象開始處理監聽到的事件(code
程序啓動成功以後,首先調用application:didFinishLaunchingWithOptions:方法,
若是info.plist文件中配置了啓動storyboard文件名,則加載storyboard文件。
若是沒有配置,則根據代碼來建立UIWindow--->UIWindow的rootViewController-->顯示)對象
info.plist文件:
Localiztion native development region | CFBundleDevelopmentRegion 本地化相關,若是用戶所在地沒有相應的語言資源,則用這個key的value來做爲默認 |
Executaule file | CFBundleExecutable 程序安裝包的名稱 |
Bundle name | CFBundleDisplayName 設置程序安裝後顯示的名稱。應用程序名稱限制在10-12個字符,若是超出,將被顯示縮寫名稱 |
Bundle identifier | CFBundleIdentifier APP的惟一標識字符串。 |
InfoDictionary version | CFBundleInfoDictionaryVersion Info.plist格式的版本信息 |
Bundle OS Type code | CFBundlePackageType 用來標識束類型的四個字母長的代碼(目前沒用到過,還不清楚怎麼用) |
Bundle versions string, short | CFBundleShortVersionString 版本字符串(版本號) |
Bundle version | CFBundleVersion 構建版本號,每次上傳以後須要增長 |
Application require iPhone environment | LSRequiresIPhoneOS:用於指示程序包是否只能運行在iPhone OS 系統上。Xcode自動加入這個鍵,並將它的值設置爲true。您不該該改變這個鍵的值。 |
supported interface orientations | UISupportedInterfaceOrientations 程序默認支持的方向。 |
APPdelegate中狀態改變調用的方法:
// 程序 開始運行 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } // 程序 掛起(有電話進來 或者 鎖屏(拉下狀態欄、雙擊Home鍵使App界面上移) 的時候) - (void)applicationWillResignActive:(UIApplication *)application { } // 程序 進入後臺 - (void)applicationDidEnterBackground:(UIApplication *)application { } // 程序 進入前臺 - (void)applicationWillEnterForeground:(UIApplication *)application { } // 程序 從新激活(復原)注意:應用程序在啓動時,在調用了「applicationDidFinishLaunching」方法以後 一樣也會 調用「applicationDidBecomeActive」方法! - (void)applicationDidBecomeActive:(UIApplication *)application { } // 程序 終止(注:若是點擊主按鈕強制退出,則不會調用該方法。) - (void)applicationWillTerminate:(UIApplication *)application { }
實際使用中碰到的幾個場景: