【iOS】被忽略的main函數,iosmain函數
如同任何基於C的應用程式,程式啟動的主進入點為iOS應用程式的main函數。在iOS應用程式,main函數的作用是很少的。它的主要工作是控制UIKit framework。因此,你在Xcode中建立任何新的項目都配備了一個預設的主函數。除了少數特例外,你永遠不應該改變這個函數的實現。
1 #import <UIKit/UIKit.h> 2 3 #import "AppDelegate.h" 4 5 int main(int argc, char * argv[]) 6 { 7 @autoreleasepool { 8 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 9 }10 }
UIApplicationMain函數有四個參數,並使用這些參數來初始化應用程式。你不應該改變傳遞給這個函數的預設值。儘管如此,瞭解他們的目的,以及他們是如何啟動的應用程式,它也是有價值的。
函數原型:
1 UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
參數解釋:
argc和argv:是ISO C標準的main函數的參數,直接傳遞給UIApplicationMain進行相關處理。參數包含應用程式何時從系統啟動等資訊。這些參數是由UIKit的基礎設施解析,否則可以忽略不計。
principalClassName:這個參數標識了應用程式的類的名稱(該類必須繼承自UIApplication類)。這是負責運行應用程式的類。建議為這個參數傳nil。
delegateClassName:是應用程式類的代理類。應用程式的代理負責管理系統和你的代碼之間的高層次的互動。 Xcode的項目模板會自動將該參數設定為一個適當的值。
UIApplicationMain函數做的另一件事是載入應用程式的主使用者介面檔案。主介面檔案包含應用程式的使用者介面中顯示的初始視圖相關的對象。對於使用storyboard的應用程式,這個函數會從你的storyboard的初始視圖控制器和您的應用程式代理程式提供的視窗運行。對於使用nib檔案的應用程式,該方法將nib檔案內容載入記憶體中,但不會在你的應用程式的視窗進行運行;您必須在應用程式委託的方法中運行如下方法。
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
一個應用程式可以有一個主storyboard檔案或者一個主nib檔案,但它不能兼得。storyboards是首選的方式來指定你的應用程式的使用者介面,但不支援在所有版本的iOS。應用程式主storyboard的檔案名稱應該在應用程式的Info.plist檔案中的UIMainStoryboardFile索引值中設定。(對於以nib檔案為基礎的應用程式,你的主nib檔案的名稱需要在NSMainNibFile索引值中設定。)通常情況下,Xcode會在你建立項目時建立相應鍵的值,但可以根據需要變更。
如果主要nib檔案存在,就會在nib檔案對象裡尋找Application對象和串連它的delegate。此函數會根據principalClassName建立UIApplication對象,然後根據delegateClassName建立一個delegate對象,並將UIApplication對象中的delegate屬性設定為delegate對象。
在程式啟動時:
當您的應用程式啟動(無論是進入前台還是後台),需要使用如下方法並進行相應操作:
1 - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);2 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(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;方法來完成過渡到前台。因為這種方法既在啟動時與從後台過渡到前台時被調用,使用它來執行所共有的兩個轉變的任何任務。
當程式在後台運行時,除了準備好對任何事件到達的處理,不應該有太多的任務讓應用程式做。