iOS 如何優(yōu)化 App 的啟動耗時

iOS 的 App 啟動時長大概可以這樣計算:

  • t(App 總啟動時間) = t1(main 調用之前的加載時間) + t2(main 調用之后的加載時間)
  • t1 = 系統(tǒng) dylib(動態(tài)鏈接庫)自身 App 可執(zhí)行文件的加載
  • t2 = main方法執(zhí)行之后到AppDelegate類中的application:didFinishLaunchingWithOptions:方法執(zhí)行結束前這段時間,主要是構建第一個界面,并完成渲染展示
  1. t1階段加快App啟動的建議:
  • 盡量使用靜態(tài)庫,減少動態(tài)庫的使用,動態(tài)鏈接比較耗時,如果要用動態(tài)庫,盡量將多個dylib動態(tài)庫合并成一個
  • 盡量避免對系統(tǒng)庫使用optional linking,如果App用到的系統(tǒng)庫在你所有支持的系統(tǒng)版本上都有,就設置為required,因為optional會有些額外的檢查
  • 減少Objective-C Class、Selector、Category的數量,可以合并或者刪減一些OC
  • 刪減一些無用的靜態(tài)變量,刪減沒有被調用到或者已經廢棄的方法
  • 將不必須在+load中做的事情盡量挪到+initialize中,+initialize是在第一次初始化這個類之前被調用,+load在加載類的時候就被調用。盡量將+load里的代碼延后調用
  • 盡量不要用C++虛函數,創(chuàng)建虛函數表有開銷
  • 不要使用__attribute__((constructor))將方法顯式標記為初始化器,而是讓初始化方法調用時才執(zhí)行。比如使用dispatch_once(),pthread_once()或 std::once()
  • 在初始化方法中不調用dlopen(),dlopen()有性能和死鎖的可能性
  • 在初始化方法中不創(chuàng)建線程
  1. t2階段加快App啟動的建議:
  • 盡量不要使用xib/storyboard,而是用純代碼作為首頁UI,如果要用xib/storyboard,不要在xib/storyboard中存放太多的視圖
  • application:didFinishLaunchingWithOptions:里的任務盡量延遲加載或懶加載
  • 不要在NSUserDefaults中存放太多的數據,NSUserDefaults是一個plist文件,plist文件會被反序列化一次
  • 避免在啟動時打印過多的log,少用NSLog,因為每一次NSLog的調用都會創(chuàng)建一個新的NSCalendar實例
  • 為了防止使用GCD創(chuàng)建過多的線程,解決方法是創(chuàng)建串行隊列,或者使用帶有最大并發(fā)數限制的NSOperationQueue
  • 不要在主線程執(zhí)行磁盤、網絡、Lock或者dispatch_sync、發(fā)送消息給其他線程等操作

附:我的博客地址

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

相關閱讀更多精彩內容

  • iOS 的 App 啟動主要分為以下步驟: 打開 App,系統(tǒng)內核進行初始化跳轉到 dyld 執(zhí)行。這個過程包括這...
    iOS猿_員閱讀 6,902評論 2 35
  • 冷啟動 定義 從用戶點擊App圖標開始到appDelegate didFinishLaunching方法執(zhí)行完成為...
    佐_籩閱讀 1,376評論 0 7
  • 最近讀了幾篇文章,關于iOS啟動優(yōu)化,目前看,只有這一篇全面透徹一點。 今日頭條iOS客戶端啟動速度優(yōu)化 應用啟動...
    素還真人閱讀 623評論 0 3
  • 前言 最近和公司iOS小組伙伴討論準備對各自手上的產品做一次優(yōu)化,確實對比很多產品來看,(支付寶,淘寶,幾乎1~2...
    Cingjin閱讀 1,880評論 0 7
  • 《和平飯店》開播,豆瓣評分一個勁兒往上飚,我偷偷的在心里樂了開花,因為我欣賞好多年的那個演員,終于悄咪咪的火了起來...
    我是隱形的閱讀 965評論 2 8

友情鏈接更多精彩內容