iOS App啟動(dòng)過程

使用dyld2啟動(dòng)應(yīng)用的過程

1.加載dyld到App進(jìn)程(dyld首先讀取mach-o Header和load commands,接著就知道了這個(gè)可執(zhí)行文件依賴的動(dòng)態(tài)庫)
2.加載動(dòng)態(tài)庫(包括所依賴的所有動(dòng)態(tài)庫)
3.Rebase & Bind (使用了ASLR地址空間布局隨機(jī)化和Code Sign來保證應(yīng)用的安全,Rebase修正內(nèi)部指針指向,Bind修正外部指針指向)
4.初始化Objective-C Runtime (Runtime維護(hù)了一張映射類名與類的全局表,當(dāng)加載一個(gè)dylib時(shí),把類的信息注冊(cè)到這個(gè)全局表中,也會(huì)把Category中的方法注冊(cè)到對(duì)應(yīng)的類中)
5.Initializers 其他初始化代碼
6.dyld調(diào)用main()函數(shù),main()函數(shù)調(diào)用UIApplicationMain(),程序啟動(dòng)。

dyld3加載方式

分析Mach-o Headers
分析依賴的動(dòng)態(tài)庫
查找需要Rebase & Bind之類的符號(hào)
把上述結(jié)果寫入緩存

main函數(shù)之后:

(一)有storyboard
1.main函數(shù)
2.UIApplicationMain
創(chuàng)建UIApplication對(duì)象
創(chuàng)建UIApplication的delegate對(duì)象
3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard
創(chuàng)建UIWindow
創(chuàng)建和設(shè)置UIWindow的rootViewController
顯示窗口
(二)沒有storyboard
1.main函數(shù)
2.UIApplicationMain
創(chuàng)建UIApplication對(duì)象
創(chuàng)建UIApplication的delegate對(duì)象
3.delegate對(duì)象開始處理(監(jiān)聽)系統(tǒng)時(shí)間
程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
創(chuàng)建和設(shè)置UIWindow的rootViewController
顯示窗口

優(yōu)化啟動(dòng)時(shí)間

main函數(shù)之后

能延遲執(zhí)行的就延遲執(zhí)行。比如SDK的初始化,界面的創(chuàng)建。
不能延遲執(zhí)行的,盡量放到后臺(tái)執(zhí)行。比如數(shù)據(jù)讀取,原始JSON數(shù)據(jù)轉(zhuǎn)對(duì)象,日志發(fā)送。

main函數(shù)之前

減少動(dòng)態(tài)庫的數(shù)量
合并Category和功能類似的類。刪除無用的方法和類。
用initialize替代load。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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