一丙者、APP啟動(dòng)時(shí)間應(yīng)從哪些方面優(yōu)化花墩?
APP啟動(dòng)可以概括為3大階段:??dyld?runtime??main
dyld(dynamic link editor)?
Apple的動(dòng)態(tài)連接器悬秉,可以裝載Mach-O(可執(zhí)行文件、動(dòng)態(tài)庫(kù)等)
裝載app的可執(zhí)行文件冰蘑,同時(shí)遞歸加載所有依賴(lài)的動(dòng)態(tài)庫(kù)
當(dāng)dyld把可執(zhí)行文件和泌、動(dòng)態(tài)庫(kù)都裝載完成后,會(huì)通知runtime進(jìn)行下一步處理
2. runtime所做的事情
調(diào)用map_images函數(shù)中調(diào)用call_load_methods祠肥,調(diào)用所有Class和Category的+load方法
進(jìn)行各種objc結(jié)構(gòu)的初始化(注冊(cè)objc類(lèi)武氓、初始化類(lèi)對(duì)象等等)
調(diào)用C++靜態(tài)初始化器和__attribure__((constructor))修飾的函數(shù)(JSONKit中存在具體應(yīng)用)
到此為止,可執(zhí)行文件和動(dòng)態(tài)庫(kù)中所有的符號(hào)(Class, Protocol, Selector, IMP…)都已按格式成功加載到內(nèi)存中仇箱,被runtime所管理
3. 總結(jié)
app的啟動(dòng)由dylb主導(dǎo)聋丝,將可執(zhí)行文件加載到內(nèi)存,順便加載所有依賴(lài)的動(dòng)態(tài)庫(kù)
并由runtime負(fù)責(zé)加載成objc定義的結(jié)構(gòu)
所有初始化工作結(jié)束后工碾,dyld就會(huì)調(diào)用main函數(shù)
接下來(lái)就是ApplicationMain函數(shù)弱睦,AppDelegate的application:didFinishLaunchingWithOptions:方法
4. 按照不同的階段優(yōu)化?
dyld
減少動(dòng)態(tài)庫(kù)、合并一些動(dòng)態(tài)庫(kù)(定期清理不必要的動(dòng)態(tài)庫(kù))
減少objc類(lèi)渊额、分類(lèi)的數(shù)量况木、減少selector數(shù)量(定期清理不必要的類(lèi)、分類(lèi))
減少C++虛構(gòu)函數(shù)
Swift盡量使用struct
runtime
使用+initialize方法和dispatch_once取代所有的__attribute__((constructor))旬迹、C++靜態(tài)構(gòu)造器火惊、Objc的+load方法
main
在不影響用戶(hù)體驗(yàn)的前提下,盡可能將一些操作延遲奔垦,不要全部都放在finishLaunching方法中
按需加載