關於 iOS 中的庫

庫是什麼?

庫通常是封裝好的代碼,便於複用。例如 GitHub 上能夠看到的開源庫,開箱即用。html

下面咱們主要說的,是編譯成二進制的庫。ios

什麼場景使用二進制的庫?

  • 保護源代碼。平常開發中的各類商業 SDK 就屬於此類。只暴露頭文件給使用者,而隱藏具體的實現。
  • 加快編譯速度。由於是編譯完成的二進制,因此編譯的時候只須要 Link 一下。

動態庫與靜態庫

根據 Link 的方式,分紅了2種庫,靜態庫和動態庫。git

什麼是靜態庫?

靜態庫,即靜態連接庫。不一樣平臺的文件格式以下:github

系統 靜態庫文件格式
Windows .lib
Linux .a
MacOS/iOS .a

靜態庫的特色,在於編譯的時候會直接複製到目標程序裏。segmentfault

意味着代碼在目標程序中,不會再改變了。如圖:框架

3D044AD0-C6D0-40E4-ABD7-AB07945E6E26

什麼是動態庫?

動態庫,即動態連接庫。 不一樣平臺的文件格式以下:工具

系統 動態庫文件格式
Windows .dll
Linux .so
MacOS/iOS .dylib

動態庫的特色,在於編譯的時候,並不會被拷貝到目標程序中。post

目標程序中,只會存儲指向動態庫的引用。程序運行時,動態庫才真正被加載。gradle

而同一個動態庫,能夠被多個程序使用。如圖:code

91EDA5EA-2038-4B89-9ECB-BAA8DD4D94FE

MacOS/iOS 裏的 Framework

Framework 其實是一個 bundle 或者說特殊形式的文件夾,將庫的 二進制文件/頭文件/資源文件 打包到一塊兒。

Framework 能夠選擇建立爲動態或者靜態。

區別

因爲 .a /.dylib 等只能打包庫的二進制代碼,能夠用如下公式區別:

動態庫/靜態庫 + .h + 資源文件 = Framework.

如何製做 Framework?

製做 Framework 已經有不少教程,能夠直接谷歌百度查閱,這裏就不糾結具體過程了。能夠參考這篇文章->靜態庫和動態庫的製做(OC、Swift)

關於動態的 Framework

真正動態的 Framework ,只有蘋果自家的 UIKit.Framework,Foundation.Framework 等。

因爲 iOS 的沙盒機制,本身建立的 Framework 和系統 Framework 不一樣,App 中使用的 Framework 運行在沙盒裏,而不是系統中。每一個 App 都只能用本身對應簽名的動態庫,作不到多個 App 使用一個動態庫。

若是不一樣的 App 使用了一樣的 Framework,仍是會有多份的 Framework 被分別簽名,打包和加載。

因此,iOS 上的動態庫只能是私有的,咱們沒法將動態庫放置在除了自身沙盒之外的地方。

CocoaPods 管理庫使用的是哪一種形式?

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 靜態庫的,能夠參考下面的文章:

即刻Swift靜態庫實踐

參考

dylib淺析

iOS 靜態庫,動態庫與 Framework

iOS 靜態庫和動態庫的基本介紹和使用

CocoaPods 原理總結

如何打造一個讓人愉快的框架

相關文章
相關標籤/搜索