前言:做爲一個開發者,若是你熟悉不少語言的開發,你會發現大部分語言的一個共同點,main函數。咱們都是從main函數開始,去關注程序的編寫、編譯和執行過程。main函數以前,系統有沒有作一些其餘的工做,作了哪些工做呢,一塊兒來看看?web
一、代碼怎麼加載到內存?編程
二、靜態庫、動態庫怎麼加載到內存?markdown
三、objc_init -> objc 在哪裏執行的?app
咱們能夠想一下以上的過程是怎麼發生的,各個環節都是怎麼加載到內存的?ide
咱們常常在項目中使用靜態庫和動態庫,其中系統提供的UIKit,Foundation庫,WebKit庫等等,這些是動態庫,好比咱們常常使用的自定義的靜態Framework,.a文件,就是屬於靜態庫。那麼,靜態庫和動態庫是怎麼區分的?函數
動態庫形式:.dylib和.framework工具
靜態庫形式:.a和.frameworkoop
如上圖所示,咱們分析:post
一、靜態庫:連接時,靜態庫會被完整地複製到可執行文件中,被屢次使用就有多份冗餘拷貝spa
二、動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存
可是,系統的動態庫怎麼加載到內存呢?經過什麼方式?這裏就用到了一個工具dyld動態連接器。
上面是dyld的加載工做流程圖,經過它主要進行了動態庫的註冊和動態庫的加載過程。
在main函數的入口位置,加上斷點,運行後程序停在斷點位置,通過堆棧打印(bt爲lldb堆棧打印命令),發現程序是崩潰在了lldb中,這裏咱們並不能獲取更多信息去跟蹤。
因而,咱們經過編程經驗,想到了在程序執行main函數以前,會提早執行load函數的加載,那麼就作一下嘗試,在ViewController中假如load函數,並添加斷點,運行程序。
結果很順利,咱們斷點停在了ViewController的load方法,經過堆棧打印,發現了關於dyld的一系列函數過程。下面就引出咱們探究的主題:dyld(動態連接器),咱們的函數追蹤,也將按照這樣一個順序去進行!
dyld(the dynamic link editor)是蘋果的動態連接器,是蘋果操做系統一個重要組成部分,在系統內核作好程序準備工做以後,交由dyld負責餘下的工做。並且它是開源的,任何人能夠經過蘋果官網下載它的源碼來閱讀理解它的運做方式,瞭解系統加載動態庫的細節。
這裏咱們選擇最新的版本進行研究,技術嘛,總要與時俱進,下載完這些,先不急,先來一個蘋果的官方視頻介紹,關於dyld2,到dyld3過程的更新、特性,而後咱們在下一章介紹 dyld 的探究過程。
App Startup Time: Past, Present, and Future https://developer.apple.com/videos/play/wwdc2017/413/
咱們這裏介紹了應用啓動過程的大概過程分析,主要有:
一、動態庫與靜態庫的概念和理解
二、dyld的概念和連接過程解析
三、咱們是如何知道程序是在main函數以前進入了dyld
關於dyld的詳細執行過程,下一節單獨講解!
🌺更多內容期待與你一塊兒分享,喜歡的話,點個贊點個關注,持續爲您創造好的內容。