APP的啟動可以分為2種
- 冷啟動(Cold Launch):從零開始啟動APP搏恤;
- 熱啟動(Warm Launch):APP已經在內存中攘烛,在后臺存活著舔痕,再次點擊圖標啟動APP评抚。
APP啟動時間的優(yōu)化,主要是針對冷啟動進行優(yōu)化
- 通過添加環(huán)境變量可以打印出APP的啟動時間分析(Edit scheme -> Run -> Arguments)
DYLD_PRINT_STATISTICS設置為1伯复;
- 如果需要更詳細的信息慨代,那就將DYLD_PRINT_STATISTICS_DETAILS設置為1。
APP的冷啟動可以概括為3大階段
- dyld(dynamic link editor):
- Apple的動態(tài)鏈接器啸如,可以用來裝載Mach-O文件(可執(zhí)行文件侍匙、動態(tài)庫等)
- runtime;
- main。
1. dyld 階段:
- 裝載APP的可執(zhí)行(Mach-o)文件叮雳,同時會遞歸加載所有依賴的動態(tài)庫;
- 當dyld把可執(zhí)行文件想暗、動態(tài)庫都裝載完畢后妇汗,會通知Runtime進行下一步的處理。
2. runtime 階段:
- 調用
map_images
進行可執(zhí)行文件內容的解析和處理:
_dyld_objc_notify_register(&map_images, load_images, unmap_image);
- 在
load_images
中調用call_load_methods
说莫,調用所有Class和Category的+load方法;
// Call +load methods (without runtimeLock - re-entrant)
call_load_methods();
- 進行各種objc結構的初始化(注冊Objc類 杨箭、初始化類對象等等)
- 調用C++靜態(tài)初始化器和
__attribute__((constructor))
修飾的函數(shù)
- 到此為止,可執(zhí)行文件和動態(tài)庫中所有的符號(Class储狭,Protocol互婿,Selector,IMP晶密,…)都已經按格式成功加載到內存中擒悬,被runtime 所管理模她。
3. main函數(shù)啟動階段
- 所有初始化工作結束后稻艰,dyld就會調用main函數(shù);
- 接下來就是UIApplicationMain函數(shù)侈净,AppDelegate的
application:didFinishLaunchingWithOptions:
方法
冷啟動優(yōu)化:
1. dyld階段
- 減少動態(tài)庫尊勿、合并一些動態(tài)庫(定期清理不必要的動態(tài)庫);
- 減少Objc類、分類的數(shù)量畜侦、減少Selector數(shù)量(定期清理不必要的類元扔、分類);
- 減少C++虛函數(shù)數(shù)量;(虛函數(shù)的存在,會生成一張?zhí)摫恚?/li>
- Swift盡量使用struct旋膳。
2. runtime階段
- 用+initialize方法和dispatch_once取代所有的
__attribute__((constructor))
澎语、C++靜態(tài)構造器、ObjC的+load
验懊。
+ (void)initialize {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
}
3. main
- 在不影響用戶體驗的前提下擅羞,盡可能將一些操作延遲,不要全部都放在finishLaunching方法中;
- 按需加載义图。
iOS性能優(yōu)化:
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者