1. App啟動(dòng)過(guò)程
- 解析Info.plist
- 加載相關(guān)信息,例如如閃屏
- 沙箱建立躏精、權(quán)限檢查
- Mach-O加載
- 如果是胖二進(jìn)制文件渣刷,尋找合適當(dāng)前CPU類(lèi)別的部分
- 加載所有依賴(lài)的Mach-O文件(遞歸調(diào)用Mach-O加載的方法)
- 定位內(nèi)部、外部指針引用矗烛,例如字符串辅柴、函數(shù)等
- 執(zhí)行聲明為attribute((constructor))的C函數(shù)
- 加載類(lèi)擴(kuò)展(Category)中的方法
- C++靜態(tài)對(duì)象加載、調(diào)用ObjC的 +load 函數(shù)
- 程序執(zhí)行
- 調(diào)用main()
- 調(diào)用UIApplicationMain()
- 調(diào)用applicationWillFinishLaunching
2瞭吃、影響啟動(dòng)性能的因素
- main()函數(shù)之前耗時(shí)的影響因素
- 動(dòng)態(tài)庫(kù)加載越多碌嘀,啟動(dòng)越慢。
- ObjC類(lèi)越多歪架,啟動(dòng)越慢
- C的constructor函數(shù)越多股冗,啟動(dòng)越慢
- C++靜態(tài)對(duì)象越多,啟動(dòng)越慢
- ObjC的+load越多和蚪,啟動(dòng)越慢
- main()函數(shù)之后耗時(shí)的影響因素
- 執(zhí)行main()函數(shù)的耗時(shí)
- 執(zhí)行applicationWillFinishLaunching的耗時(shí)
- rootViewController及其childViewController的加載止状、view及其subviews的加載
另外參考一下今日頭條的啟動(dòng)優(yōu)化方案
針對(duì)于今日頭條這個(gè)App我們可以?xún)?yōu)化的點(diǎn)如下:
- 純代碼方式而不是storyboard加載首頁(yè)UI。
- 對(duì)didFinishLaunching里的函數(shù)考慮能否挖掘可以延遲加載或者懶加載攒霹,需要與各個(gè)業(yè)務(wù)方pm和rd共同check 對(duì)于一些已經(jīng)下線的業(yè)務(wù)怯疤,刪減冗余代碼。
- 對(duì)于一些與UI展示無(wú)關(guān)的業(yè)務(wù)剔蹋,如微博認(rèn)證過(guò)期檢查旅薄、圖片最大緩存空間設(shè)置等做延遲加載。
對(duì)實(shí)現(xiàn)了+load()方法的類(lèi)進(jìn)行分析泣崩,盡量將load里的代碼延后調(diào)用少梁。 - 上面統(tǒng)計(jì)數(shù)據(jù)顯示展示feed的導(dǎo)航控制器頁(yè)面(NewsListViewController)比較耗時(shí),對(duì)于viewDidLoad以及viewWillAppear方法中盡量去嘗試少做矫付,晚做凯沪,不做。
更多:iOS面試題合集