iOS中的動態庫,靜態庫和framework介紹

東廠胡一刀發表於2019-12-14

1、什麼是庫

首先來看什麼是庫,庫(Library)說白了就是一段編譯好的二進位制程式碼,加上標頭檔案就可以供別人使用。

什麼時候我們會用到庫呢?

  1. 一種情況是某些程式碼需要給別人使用,但是我們不希望別人看到原始碼,就需要以庫的形式進行封裝,只暴露出標頭檔案。 (一些引入的第三方庫)
  2. 對於某些不會進行大的改動的程式碼,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經編譯好的二進位制了,編譯的時候只需要 Link 一下,不會浪費編譯時間。 (一些比較穩定的工具類,或者很穩定的功能模組)

2、概念介紹

動態庫,靜態庫,framework 其實不是一個維度上。

1、framework

framework並不是庫,它只是一種打包方式,它既可以是動態庫也可以是靜態庫。將庫的二進位制檔案,標頭檔案和有關的資原始檔打包到一起,方便管理和分發,和靜態庫動態庫的本質是沒有什麼關係。

2、靜態庫

靜態庫 (靜態連結庫) 以.a 和 .framework 結尾 。 只所以叫靜態庫在編譯的時候會被直接拷貝一份,複製到目標程式裡,這段程式碼在程式裡就不會在改變

優點:編譯完成之後,庫檔案沒有作用了,目標沒有外部依賴,直接可以執行

缺點: 會是目標體積增大

3、動態庫

動態庫(動態連結庫) 以 .dylib 或者 .framework 字尾結尾 與靜態庫相反,動態庫在編譯時並不會被拷貝到目標程式中,目標程式中只會儲存指向動態庫的引用。等到程式執行時,動態庫才會被真正載入進來。

優點:不會影響目標程式的體積,而且同一份庫可以被多個程式使用(因為這個原因,動態庫也被稱作共享庫)。同時,執行時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯程式碼。

缺點: 動態載入會帶來一部分效能損失,使用動態庫也會使得程式依賴於外部環境。如果環境缺少動態庫或者庫的版本不正確,就會導致程式無法執行(Linux 下喜聞樂見的 lib not found 錯誤)。

3 ios 常見的幾種庫

系統動態庫 Dynamic Framework

系統提供的 framework 都是動態庫,比如 UIKit.framework,具有所有動態庫的特性。

使用者動態庫 Embedded Framework

使用者可以製作的“動態庫”,它是受到 iOS 平臺限制(簽名機制和沙盒機制限制)的動態庫,它具有部分動態特性,比如:

  • Embedded Framework 可以在 Extension可執行檔案 和 APP可執行檔案 之間共享,但是不能像系統的動態庫一樣,在不同的 APP(程式) 中共享
  • 系統的 Framework 不需要拷貝到目標程式中,Embedded Framework 最後也還是要拷貝到 APP 中.

靜態庫 tatic Framework

Static Framework,靜態庫,使用者可以製作,可以粗略的理解為,它等價於 標頭檔案 + 資原始檔 + 二進位制程式碼,它具有靜態庫的屬性。

靜態庫就是我們元件化中常見的工具庫

ios中的動態庫,靜態庫 ios製作靜態庫

相關文章