本文首發於我的博客php
在Mac 、iOS中,是使用了/usr/lib/dyld程序來加載動態庫html
dynamic link editor,動態連接編輯器ios
dynamic loader,動態加載器git
dyld 的源碼 opensource.apple.com/tarballs/dy…github
initializeMainExecutable 方法開始的.dyld會優先初始化動態庫,而後初始化App的可執行文件。
複製代碼
用MachOView (github.com/gdbinit/Mac…)查看加載過程如上圖數據庫
( 備註1: 若是設置了 DYLD_PRINT_LIBRARIES,或者選中run/diagnostics 下面的 dynamic library loads 那麼 dyld將會打印出什麼庫被加載了緩存
備註2:DYLD_PRINT_STATISTICS_DETAILS 打印啓動時間性能優化
備註3:dyly還能夠抽取蘋果原生庫 方法: 1: launch-cache/dsc_extractor.cpp文件中 把#if(0) 以及以前的都刪除,#endif也刪除 2:編譯clang++ -o dsc_extractor dsc_extractor.cpp 生成可執行文件 3:./dsc_extractor dyld_shared_cache_armv7s armv7s 進行抽取 )bash
源碼: opensource.apple.com/source/objc… 源碼分析可參考:www.jianshu.com/p/3019605a4…網絡
啓動APP時,runtime所作的事情有
關於load
和initialize
可參考iOS中load和initialize一文詳細分析
main() 函數執行後的階段,指的是從 main() 函數執行開始,到 appDelegate 的 didFinishLaunchingWithOptions 方法裏首屏渲染相關方法執行完成。
APP的啓動由dyld主導,將可執行文件加載到內存,順便加載全部依賴的動態庫, 並由runtime負責加載成objc定義的結構,全部初始化工做結束後,dyld就會調用main函數, 接下來就是UIApplicationMain函數,AppDelegate的application:didFinishLaunchingWithOptions:方法
按照不一樣的階段
Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Default設置爲YES
去掉異常支持,Enable C++ Exceptions、Enable Objective-C Exceptions設置爲NO, Other C Flags添加-fno-exceptions
(www.jetbrains.com/objc/)檢測未使用的代碼:菜單欄 -> Code -> Inspect Code
CPU (Central Processing Unit,中央處理器)
對象的建立和銷燬、對象屬性的調整、佈局計算、文本的計算和排版、圖片的格式轉換和解碼、圖像的繪製(Core Graphics)
GPU (Graphics Processing Unit,圖形處理器)
紋理的渲染
在iOS中是雙緩衝機制,有前幀緩存、後幀緩存
1 > Analyze
- 學 名: 靜態分析工具- 查 找: 能夠經過 Product ->Analyze 菜單項啓動- 快捷鍵: CMD+shift +b.- Analyze主要分析如下四種問題:
1) 邏輯錯誤:訪問空指針或未初始化的變量等;
2) 內存管理錯誤:如內存泄漏等;
3) 聲明錯誤:從未使用過的變量;
4) Api調用錯誤:未包含使用的庫和框架。
複製代碼
2 >Instruments
- 學 名: 動態分析工具- 查 找: Product ->Profile 菜單項啓動- 快捷鍵: CMD + i.
簡 介:它有不少跟蹤模塊能夠動態分析和跟蹤內存, CPU 和文件系統.
複製代碼
儘量下降CPU、GPU功耗
少用定時器
優化I/O操做
儘可能不要頻繁寫入小數據,最好批量一次性寫入
讀寫大量重要數據時,考慮用dispatch_io,其提供了基於GCD的異步操做文件I/O的API。用dispatch_io系統會優化磁盤訪問
數據量比較大的,建議使用數據庫(好比SQLite、CoreData)
網絡優化
定位優化
若是隻是須要快速肯定用戶位置,最好用CLLocationManager的requestLocation方法。定位完成後,會自動讓定位硬件斷電
若是不是導航應用,儘可能不要實時更新位置,定位完畢就關掉定位服務
儘可能下降定位精度,好比儘可能不要使用精度最高的kCLLocationAccuracyBest
須要後臺定位時,儘可能設置pausesLocationUpdatesAutomatically爲YES,若是用戶不太可能移動的時候系統會自動暫停位置更新
儘可能不要使用startMonitoringSignificantLocationChanges,優先考慮startMonitoringForRegion:
用戶移動、搖晃、傾斜設備時,會產生動做(motion)事件,這些事件由加速度計、陀螺儀、磁力計等硬件檢測。在不須要檢測的場合,應該及時關閉這些硬件
iOS啓動優化博客:www.zoomfeng.com/blog/launch…
dyld源碼: opensource.apple.com/tarballs/dy…
dyld簡介和分析:www.jianshu.com/p/be413358c…
runtime源碼:opensource.apple.com/source/objc…
runtime源碼分析:www.jianshu.com/p/3019605a4…
objc_msgSend源碼: opensource.apple.com/source/objc…
開源項目fishhook: github.com/facebook/fi…
開源項目LSUR: github.com/tinymind/LS…
AppCode官網:www.jetbrains.com/objc/
開源項目LinkMap: github.com/huanxsd/Lin…
GNUstep源碼 www.gnustep.org/resources/d…
MachOView源碼:github.com/gdbinit/Mac…
今日頭條iOS客戶端啓動速度優化:techblog.toutiao.com/2017/01/17/…
iOS 性能優化github.com/skyming/iOS…
更多資料,歡迎關注我的公衆號,不定時分享各類技術文章。