以上是Xcode4.2中不采用storyboard應用的默認啟動流程圖。對於采用了storyboard的應用,UIApplicationMain()
將會額外加載應用的主要storyboard文件,從而創建窗口和初始視圖。
程序啟動的完整過程
1.main函數
2.UIApplicationMain
* 創建UIApplication對象
* 創建UIApplication的delegate對象
3.delegate對象開始處理(監聽)系統事件(沒有storyboard)
* 程序啟動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中創建UIWindow
* 創建和設置UIWindow的rootViewController
* 顯示窗口
3.根據Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
* 創建UIWindow
* 創建和設置UIWindow的rootViewController
* 顯示窗口
一、UIApplicationMain這個函數主要負責三件 事情:
1)從給定的類名初始化應用程序對象,也就是初始化UIApplication或者子類對象的一個實例,如果你在這里給定的是nil,那么 系統會默認UIApplication類,也就主要是這個類來控制以及協調應用程序的運行。在后續的工作中,你可以用靜態方法sharedApplication 來獲取應用程序的句柄。
2)從給定的應用程序委托類,初始化一個應用程序委托(UIApplicationDelegate)。並把該委托設置為應用程序的委托,這里就有如果傳入參數為nil,會調用函數訪問 Info.plist文件來尋找主nib文件,獲取應用程序委托。
3)啟動主事件循環,並開始接收事件。
二、UIApplication(或 者子類)對象的職責,這個對象主要做下面幾件事:
1)負責處理到來的用戶事件,並分發事件消息到應該處理該消息的目標對象(sender, action)。
2)管理以及控制視圖,包括呈現、控制行為、當前顯示視圖等。
3)該對象有一個應用程序委托對象,當一些生命周期內重要事件(可以包括系統事件或者生命周期控制事件)發生時,應用程序通知該對象。例如,應用程序啟 動、內存不夠了或者應用程序結束等,讓這些事件發生時,應用程序委托去響應。
UIApplication有以下成員變量
1、sharedApplication類方法獲取當前程序的UIApplication實例
2、delegate屬性獲取UIApplicationDelegate實現類的實例
3、windows屬性獲取當前程序涉及到窗口類數組
4、keyWindow屬性獲取當前程序關鍵窗口
所以當前的windows存放在UIApplication中。
以上流程圖是沒有加載sb的,以下是加載sb的流程:
--.UIApplicationMain函數里面做了什么事情:
3.創建UIApplication的delegate對象-----XXAppDelegate;
* 每監聽到對應的系統事件時,就會通知MJAppDelegate;
8.加載最主要的storyboard文件,創建白色箭頭所指的控制器對象;
9.並且將8步奏里創建的控制器為UIWindow的rootViewController屬性(根控制器);
10.展示UIWindow,展示之前會將添加rootViewController的view到UIWindow上面(在這一步才會創建控制器的view)
[window addSubview: window.rootViewControler.view];
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- [self.window addSubview:tableViewController.view];
- [self.window makeKeyAndVisible];
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- [self.window addSubview:tableViewController.view];
- [self.window makeKeyAndVisible];
- return YES;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- NSLog(@"here1");
- NSLog(@"%@",self.window);
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- NSLog(@"here2");
- [self.window addSubview:tableViewController.view];
- NSLog(@"here3");
- return YES;
- }
- 2014-09-20 16:30:22.066 Refer[3253:60b] ViewController : initWithCoder:
- 2014-09-20 16:30:22.074 Refer[3253:60b] here1
- 2014-09-20 16:30:22.077 Refer[3253:60b] <UIWindow: 0x14db9020; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x14db9cb0>; layer = <UIWindowLayer: 0x14dbb910>>
- 2014-09-20 16:30:22.079 Refer[3253:60b] here2
- 2014-09-20 16:30:22.091 Refer[3253:60b] TableViewController : viewDidLoad
- 2014-09-20 16:30:22.095 Refer[3253:60b] here3
- 2014-09-20 16:30:22.104 Refer[3253:60b] ViewController : viewDidLoad
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // Override point for customization after application launch.
- NSLog(@"here1");
- NSLog(@"%@",self.window);
- NSLog(@"%@",self.window.rootViewController);
- TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain];
- NSLog(@"here2");
- [self.window setRootViewController:tableViewController];
- // or [self.window.rootViewController.view addSubview:tableViewController.view];
- NSLog(@"here3");
- return YES;
- }
- 2014-09-20 16:40:14.135 Refer[3260:60b] ViewController : initWithCoder:
- 2014-09-20 16:40:14.143 Refer[3260:60b] here1
- 2014-09-20 16:40:14.146 Refer[3260:60b] <UIWindow: 0x16e5f570; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e5fc10>; layer = <UIWindowLayer: 0x16e5f650>>
- 2014-09-20 16:40:14.148 Refer[3260:60b] <ViewController: 0x16da9be0>
- 2014-09-20 16:40:14.150 Refer[3260:60b] here2
- 2014-09-20 16:40:14.153 Refer[3260:60b] here3
- 2014-09-20 16:40:14.167 Refer[3260:60b] TableViewController : viewDidLoad
- 014-09-20 16:43:21.707 Refer[3268:60b] ViewController : initWithCoder:
- 2014-09-20 16:43:21.716 Refer[3268:60b] here1
- 2014-09-20 16:43:21.718 Refer[3268:60b] <UIWindow: 0x16d88720; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e7a1b0>; layer = <UIWindowLayer: 0x16d8c2b0>>
- 2014-09-20 16:43:21.720 Refer[3268:60b] <ViewController: 0x16d8a170>
- 2014-09-20 16:43:21.722 Refer[3268:60b] here2
- 2014-09-20 16:43:21.731 Refer[3268:60b] ViewController : viewDidLoad // <span style="color:#cc0000;">因為調用到了它</span>
- 2014-09-20 16:43:21.741 Refer[3268:60b] TableViewController : viewDidLoad
- 2014-09-20 16:43:21.743 Refer[3268:60b] here3