使用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。