App 的啟動流程

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、圖示

APP 啟動.png

解析
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__);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容