如同任何基於C的應用程序,程序啓動的主入口點爲iOS應用程序的main函數。在iOS應用程序,main函數的做用是不多的。它的主要工做是控制UIKit framework。所以,你在Xcode中建立任何新的項目都配備了一個默認的主函數。除了少數特例外,你永遠不該該改變這個函數的實現。網絡
#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
UIApplicationMain函數有四個參數,並使用這些參數來初始化應用程序。你不該該改變傳遞給這個函數的默認值。儘管如此,瞭解他們的目的,以及他們是如何啓動的應用程序,它也是有價值的。數據結構
函數原型:app
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);
參數解釋:異步
argc和argv:是ISO C標準的main函數的參數,直接傳遞給UIApplicationMain進行相關處理。參數包含應用程序什麼時候從系統啓動等信息。這些參數是由UIKit的基礎設施解析,不然能夠忽略不計。 函數
principalClassName:這個參數標識了應用程序的類的名稱(該類必須繼承自UIApplication類)。這是負責運行應用程序的類。建議爲這個參數傳nil。spa
delegateClassName:是應用程序類的代理類。應用程序的代理負責管理系統和你的代碼之間的高層次的互動。 Xcode的項目模板會自動將該參數設置爲一個適當的值。線程
UIApplicationMain函數作的另外一件事是加載應用程序的主用戶界面文件。主界面文件包含應用程序的用戶界面中顯示的初始視圖相關的對象。對於使用storyboard的應用程序,這個函數會從你的storyboard的初始視圖控制器和您的應用程序代理提供的窗口運行。對於使用nib文件的應用程序,該方法將nib文件內容加載內存中,但不會在你的應用程序的窗口進行運行;您必須在應用程序委託的方法中運行以下方法。代理
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
一個應用程序能夠有一個主storyboard文件或者一個主nib文件,但它不能兼得。storyboards是首選的方式來指定你的應用程序的用戶界面,但不支持在全部版本的iOS。應用程序主storyboard的文件名應該在應用程序的Info.plist文件中的UIMainStoryboardFile鍵值中設定。(對於以nib文件爲基礎的應用程序,你的主nib文件的名稱須要在NSMainNibFile鍵值中設定。)一般狀況下,Xcode會在你建立項目時建立相應鍵的值,但能夠根據須要進行更改。code
若是主要nib文件存在,就會在nib文件對象裏尋找Application對象和鏈接它的delegate。此函數會根據principalClassName建立UIApplication對象,而後根據delegateClassName建立一個delegate對象,並將UIApplication對象中的delegate屬性設置爲delegate對象。對象
在程序啓動時:
當您的應用程序啓動(不管是進入前臺仍是後臺),須要使用以下方法並進行相應操做:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
①檢查啓動選項字典中的內容,查看程序啓動的方式,並作出適當的反應。
②初始化應用程序的關鍵數據結構。
③準備好你的應用程序的窗口和視圖進行顯示。
使用OpenGL ES的應用程序不該該使用這個方法來準備他們的繪圖環境。相反,他們應該推遲到
- (void)applicationDidBecomeActive:(UIApplication *)application;
方法調用時啓動OpenGL ES繪圖方法。
若是您的應用程序不會自動在啓動時加載一個主要storyboard或nib文件,您可使用
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
編寫你的應用程序的窗口顯示。對於同時支持縱向和橫向的應用程序,始終設置主窗口的根視圖控制器在縱向方向。若是該設備是在一個不一樣的方向在啓動時,系統會告訴根視圖控制器顯示窗口的旋轉信息,以保持正確的方向。
您的應用程序
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
方法應該老是儘量爲輕量,以減小你的應用程序的啓動時間。應用預期將啓動並初始化自身,並開始處理不到5秒的事件。若是一個應用程序沒有及時完成它的啓動週期,系統會殺死它。所以,有可能你的啓動慢下來(如接入網絡)的任何任務,應在異步輔助線程執行。
當程序啓動到前臺,該系統還會調用
- (void)applicationDidBecomeActive:(UIApplication *)application;
方法來完成過渡到前臺。由於這種方法既在啓動時與從後臺過渡到前臺時被調用,使用它來執行所共有的兩個轉變的任何任務。
當程序在後臺運行時,除了準備好對任何事件到達的處理,不該該有太多的任務讓應用程序作。