庫通常是封裝好的代碼,便於複用。例如 GitHub 上能夠看到的開源庫,開箱即用。html
下面咱們主要說的,是編譯成二進制的庫。ios
根據 Link 的方式,分紅了2種庫,靜態庫和動態庫。git
靜態庫,即靜態連接庫。不一樣平臺的文件格式以下:github
系統 | 靜態庫文件格式 |
---|---|
Windows | .lib |
Linux | .a |
MacOS/iOS | .a |
靜態庫的特色,在於編譯的時候會直接複製到目標程序裏。segmentfault
意味着代碼在目標程序中,不會再改變了。如圖:框架
動態庫,即動態連接庫。 不一樣平臺的文件格式以下:工具
系統 | 動態庫文件格式 |
---|---|
Windows | .dll |
Linux | .so |
MacOS/iOS | .dylib |
動態庫的特色,在於編譯的時候,並不會被拷貝到目標程序中。post
目標程序中,只會存儲指向動態庫的引用。程序運行時,動態庫才真正被加載。gradle
而同一個動態庫,能夠被多個程序使用。如圖:code
Framework 其實是一個 bundle 或者說特殊形式的文件夾,將庫的 二進制文件/頭文件/資源文件 打包到一塊兒。
Framework 能夠選擇建立爲動態或者靜態。
因爲 .a /.dylib 等只能打包庫的二進制代碼,能夠用如下公式區別:
動態庫/靜態庫 + .h + 資源文件 = Framework.
製做 Framework 已經有不少教程,能夠直接谷歌百度查閱,這裏就不糾結具體過程了。能夠參考這篇文章->靜態庫和動態庫的製做(OC、Swift)
真正動態的 Framework ,只有蘋果自家的 UIKit.Framework,Foundation.Framework 等。
因爲 iOS 的沙盒機制,本身建立的 Framework 和系統 Framework 不一樣,App 中使用的 Framework 運行在沙盒裏,而不是系統中。每一個 App 都只能用本身對應簽名的動態庫,作不到多個 App 使用一個動態庫。
若是不一樣的 App 使用了一樣的 Framework,仍是會有多份的 Framework 被分別簽名,打包和加載。
因此,iOS 上的動態庫只能是私有的,咱們沒法將動態庫放置在除了自身沙盒之外的地方。
CocoaPods 是 iOS 項目的依賴管理工具,相似於 Android 的 gradle。不過gradle 還能負責構建, CocoaPods 只管理依賴。
CocoaPods 目前分別支持了 Framework 動態庫
和 .a 靜態庫
2種方式。
默認使用的是 .a 靜態庫的方式,主工程依賴 libPods.a,經過腳本,把資源等文件複製到目標目錄。
在 Podfile 使用了
use_frameworks!
進行聲明,則使用 Framework 動態庫的形式.主工程對 Pods 的依賴爲 Pods.framework。
因爲 Xcode9 以前 Swift 項目不支持靜態庫,若是爲 Swift 項目,就必須採用 user_frameworks!
聲明。
關於 Xcode9 之後使用 Swift 靜態庫的,能夠參考下面的文章: