2011-02-22 35 views
8

有人能解釋一下如何控制iOS應用程序中的執行流程嗎?我知道UIApplicationMain是從main調用的第一個。那又怎麼樣?我定義的方法和main之間有什麼關係?這一切都是事件驅動的還是可以有一些結構化的序列?Main中的UIApplicationMain之後的Objective C執行順序是什麼?

我不是故意含糊不清,我只是需要知道從哪裏開始。也許我以錯誤的方式看待這個問題。

例如,在C++中我會做這樣的事情:

#include "myMethods.h" 
int main (int argc, char * const argv[]) { 

    Method1(); // Initialization 
    Method2(); // Opening views and options 
    Method3(); // Meat of the program 

    return 0; 
} 

在此先感謝。

+2

僅供參考,'UIApplicationMain()'永遠不會返回。該應用程序通過調用exit()來終止。因此,在'main()'中'UIApplicationMain(argc,argv,nil,nil);'後面放置的任何東西都不會被執行。永遠不能。 –

+1

呃。 @Dave如果那是真的,那真的會讓我失望。它回到BASIC的時代,我們只是把STOP放在GOSUB的中間! –

回答

7

正如你所說UIApplicationMain在系統中創建一個應用程序執行。在應用程序加載過程中,我假設您對與特定應用程序相關的內容感興趣。另外我假設一個典型的案例,這在Xcode提供的許多項目模板中都有說明。

應用程序加載過程查看應用程序的信息屬性列表。在那裏找到'Main nib file base name',並且應用程序的UIApplication實例從應用程序包中加載相應的nib文件。這個nib文件指定了一個應用程序委託類,並告知將該類的一個實例連接到您的UIApplication實例的委託屬性。

取決於主筆尖文件,可以被創建並連接爲好,例如其他的目的,應用程序的窗口,主視圖控制器等

現在裝載序列結束,並且一切是所有的事件驅動,從您的應用程序委託類開始獲取着名的-applicationDidFinishLaunching:消息。

2

從蘋果公司的文件 -

應用程序生命週期構成的事件您的應用程序的啓動和終止之間發生的順序。在iOS中,用戶通過點擊主屏幕上的圖標來啓動您的應用程序。輕敲發生後不久,系統會顯示一些過渡圖形,並通過調用其主要功能繼續啓動應用程序。從這一點開始,大量的初始化工作被移交給UIKit,後者加載應用程序的主要nib文件並準備好事件循環。

Application Life Cycle

17

因此,正如您所提到的,main.m中的main()函數是起點,然後調用UIApplicationMain()。如果您檢查文檔,你會看到UIApplicationMain有四個參數:

  • ARGC,
  • *的argv [],
  • * principalClassName
  • * delegateClassName。

其中前兩個只是從main()傳遞的參數個數和變量列表。但是第三和第四個參數是指向NSStrings的指針。第三個參數指定哪個類應該是UIApplication。除非您打算繼承UIApplication,否則您需要爲第三個參數指定nil。第四個參數指定哪個類應該是UIApplication的委託類,它將響應UIApplicationDelegate協議中指定的任何內容。你不必直接與此淤泥,因爲它包含在所有的Xcode的模板:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

不要讓NSStringFromClass([AppDelegate class]))位扔你。這只是指定第四個參數的一種奇妙方式,以便稍後更改名稱AppDelegate.m以便正確的委託被調用。

UIApplication開始main event loop並呼叫-application:didFinishLaunchingWithOptions:,它的委託必須處理的方法之一。看看AppDelegate.m,你會發現這個方法的一些模板代碼。在這裏,您可以開始定製,創造一些東西需要到位的UIViewUIWindow等情況下獲得創建前:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

所以,現在的應用程序窗口和根視圖控制器的定義,和應用程序已關閉並正在運行。更

所有這一切,並頗有幾分,出色這裏解釋:http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/

相關問題