改文章轉自 文文頂
三、程序啟動原理
UIApplicationMain
main函數中執行了一個UIApplicationMain這個函數
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
- argc、argv:直接傳遞給UIApplicationMain進行相關處理即可
- principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為默認值
- delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協議
- UIApplicationMain函數會根據principalClassName創建UIApplication對象,根據delegateClassName創建一個delegate對象,并將該delegate對象賦值給UIApplication對象中的delegate屬性
- 接著會建立應用程序的Main Runloop(事件循環),進行事件的處理(首先會在程序完畢后調用delegate對象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時UIApplicationMain函數才返回
#import <UIKit/UIKit.h>
#import "YYAppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
// return UIApplicationMain(argc, argv, nil, NSStringFromClass([YYAppDelegate class]));
// return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([YYAppDelegate class]));
/*
argc: 系統或者用戶傳入的參數個數
argv: 系統或者用戶傳入的實際參數
1.根據傳入的第三個參數創建UIApplication對象
2.根據傳入的第四個產生創建UIApplication對象的代理
3.設置剛剛創建出來的代理對象為UIApplication的代理
4.開啟一個事件循環
*/
return UIApplicationMain(argc, argv, @"UIApplication", @"YYAppDelegate");
}
}
系統入口的代碼和參數說明:
argc:系統或者用戶傳入的參數
argv:系統或用戶傳入的實際參數
1.根據傳入的第三個參數,創建UIApplication對象
2.根據傳入的第四個產生創建UIApplication對象的代理
3.設置剛剛創建出來的代理對象為UIApplication的代理
4.開啟一個事件循環(可以理解為里面是一個死循環)這個時間循環是一個隊列(先進先出)先添加進去的先處理
ios程序啟動原理
四、程序啟動的完整過程
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
- 顯示窗口