1、pre-main 階段(系統(tǒng)主導(dǎo))
1、加載 Mach-O 可執(zhí)行文件;
2、dyld 庫加載;
3、Runtime 初始化;
1、加載 Mach-O 可執(zhí)行文件
1、內(nèi)核將應(yīng)用的 Mach-O 文件(包含代碼、數(shù)據(jù)等)加載到內(nèi)存中。
2、驗證文件簽名和完整性。
2、dyld 加載
dyld(dynamic link editor)Apple 的動態(tài)鏈接器,可以用來裝載 Mach-O 文件(可執(zhí)行文件、動態(tài)庫等)。dyld 所做的事情如下:
1、啟動 APP 時,dyld 會先裝載 APP 的可執(zhí)行文件。
2、再遞歸加載所有依賴的動態(tài)庫。
3、合并符號表,rebase/bind 符號。
以上完成后,會通知 Runtime 進行下一步的處理。
3、Runtime 初始化
1、Runtime 會調(diào)用 map_images 進行可執(zhí)行文件內(nèi)容的解析和處理。
2、在 load_images 中調(diào)用 call_load_methods,調(diào)用所有 Class 和 Category 的 +load 方法。
3、進行各種 objc 結(jié)構(gòu)的初始化,注冊所有 Objective-C 類、分類(Category)、方法列表、協(xié)議等元數(shù)據(jù),建立類繼承關(guān)系和消息轉(zhuǎn)發(fā)機制。
4、調(diào)用 C++ 靜態(tài)初始化器和 attribute((constructor)) 修飾的函數(shù)。
到此為止,可執(zhí)行文件和動態(tài)庫中所有的符號(Class,Protocol,Selector,IMP,…)都已經(jīng)按格式成功加載到內(nèi)存中,被 Runtime 所管理。
4、小結(jié)
1、APP 的啟動由 dyld 主導(dǎo),將可執(zhí)行文件加載到內(nèi)存,并加載所有依賴的動態(tài)庫。
2、由 Runtime 負責(zé)加載 objc 定義的結(jié)構(gòu)。
3、所有初始化工作結(jié)束后,dyld 就會調(diào)用 main 函數(shù)。
2、Main 函數(shù)階段
1、調(diào)用 UIApplicationMain 函數(shù)
創(chuàng)建 UIApplication 單例(應(yīng)用核心控制器);實例化 AppDelegate/SceneDelegate。
2、RunLoop 初始化
初始化主線程 RunLoop(尚未啟動);配置事件源(Source0/Source1/Timers)。
3、Main 函數(shù)執(zhí)行后階段(應(yīng)用主導(dǎo))
Appdelegate 的 didFinishLaunchingWithOptions 方法。
1、應(yīng)用初始化
1、生命周期回調(diào):配置全局服務(wù)(日志、統(tǒng)計、推送等),初始化核心數(shù)據(jù)模型。
2、UI 層級構(gòu)建:創(chuàng)建 UIWindow 并設(shè)置根視圖控制器,觸發(fā)視圖控制器鏈。
2、首幀渲染
1、首幀布局與繪制。
2、RunLoop 啟動:主線程 RunLoop 正式運行,事件循環(huán)處理。
3、運行事件響應(yīng)鏈
UIApplication -> UIWindow -> RootVC -> subView1...
4、圖示

解析
1、程序入口
進入 main 函數(shù),設(shè)置 AppDelegate 為函數(shù)的代理。
2、程序完成加載
[AppDelegate application:didFinishLaunchingWithOptions:]
3、創(chuàng)建 window 窗口
4、程序被激活
[AppDelegate applicationDidBecomeActive:]
5、當點擊 command+H 時(針對模擬器,手機是當點擊 home 鍵)
程序取消激活狀態(tài)
[AppDelegate applicationWillResignActive:];
程序進入后臺
[AppDelegate applicationDidEnterBackground:];
6、點擊進入工程
程序進入前臺
[AppDelegate applicationWillEnterForeground:]
程序被激活
[AppDelegate applicationDidBecomeActive:];
控制器的生命周期
// 非storyBoard(xib或非xib)都走這個方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
return self;
}
// 如果連接了串聯(lián)圖storyBoard 走這個方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"%s", __FUNCTION__);
if (self = [super initWithCoder:aDecoder]) {
}
return self;
}
// xib 加載 完成
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"%s", __FUNCTION__);
}
// 加載視圖(默認從nib)
- (void)loadView {
NSLog(@"%s", __FUNCTION__);
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor redColor];
}
//視圖控制器中的視圖加載完成,viewController自帶的view加載完成
- (void)viewDidLoad {
NSLog(@"%s", __FUNCTION__);
[super viewDidLoad];
}
//視圖將要出現(xiàn)
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillAppear:animated];
}
// view 即將布局其 Subviews
- (void)viewWillLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewWillLayoutSubviews];
}
// view 已經(jīng)布局其 Subviews
- (void)viewDidLayoutSubviews {
NSLog(@"%s", __FUNCTION__);
[super viewDidLayoutSubviews];
}
//視圖已經(jīng)出現(xiàn)
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidAppear:animated];
}
//視圖將要消失
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewWillDisappear:animated];
}
//視圖已經(jīng)消失
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidDisappear:animated];
}
//出現(xiàn)內(nèi)存警告 //模擬內(nèi)存警告:點擊模擬器->hardware-> Simulate Memory Warning
- (void)didReceiveMemoryWarning {
NSLog(@"%s", __FUNCTION__);
[super didReceiveMemoryWarning];
}
// 視圖被銷毀
- (void)dealloc {
NSLog(@"%s", __FUNCTION__);
}