iOS靜態庫與動態庫的區別與打包

1、前言

這篇主要是記錄一下 iOS 下靜態庫與動態庫的打包流程,以便之後用到時快速查閱,供本身也供你們學習記錄。同時也簡述了一下 動態庫靜態庫 的區別。微信

2、靜態庫與動態庫

一、庫

庫是寫好的現有的,成熟的,能夠複用的代碼。本質上來講庫是一種可執行代碼的二進制形式,能夠被操做系統載入內存執行。庫有兩種:靜態庫動態庫iphone

二、靜態庫與動態庫的區別

(1)靜態庫

連接時會被完整的複製到可執行文件中,被屢次使用就有多分拷貝。以下圖,抖音和微信的可執行文件加載靜態庫時,每一個可執行文件連接時都要加載這份靜態庫。學習

(2)動態庫

系統的動態庫與咱們本身打包的動態庫還不大同樣,先來看一下系統的動態庫。測試

系統動態庫: 連接時不復制,程序運行時由系統動態加載到內存,系統只加載一次,多個程序共用,節省內存。 例以下圖:抖音和微信的可執行文件加載動態庫時,內存中只有一份動態庫,不用加載到可執行文件。ui

本身打包的動態庫: 本身打包的動態庫,則是在應用程序裏的,可是與靜態庫不一樣,它不在可執行文件中。 操作系統

3、製做靜態庫與動態庫

一、製做靜態庫

咱們在 iOS 下能建立的靜態庫分兩種,分爲 .a.framework 兩種。code

一、製做 .a 靜態庫

(1)建立

首先建立一個工程,選擇爲 Static Library 類型。 cdn

(2)編譯

而後咱們在 Products 下就能夠看到一個 .a 文件,可是如今它仍是不存在的,須要咱們 command+B 編譯一下,就能夠找到它了,因爲咱們是在模擬器下編譯的,因此它生成在 「Debug-iphonesimulator」 文件夾下。 blog

靜態庫最新.png

若是添加了新的 .h 文件,須要在 Phases 中把頭文件加上,此處 FanjiduoStatic.h 是建立工程時默認加進去了。 ip

而後它會自動把你的頭文件放到 include 裏面

二、製做 .framework 靜態庫

(1)首先建立一個工程,選擇爲 Framework 類型。

建立好發現是 .framework 結尾了

(2)這裏要設置一下,由於默認是動態庫,要改成靜態庫。Build Settings => Mach-O Type 改成 Static Library:

三、測試靜態庫

(1)編寫測試類

首先編寫了一個 Student 類,實現了一個 study 的打印方法, 而後把 Studentimport 進了 FanjiduoFrameworkTest.h 總的頭文件裏面。

(2)公開頭文件

而後在 build Phases => Headers 中把頭文件公開,從默認的 Project 中拖拽到 Public 中:

而後再編譯一下,就大功告成了。

(3)測試

創建一個名爲 staticTestDemo 的工程引入 framwork 試一下,發現能夠成功調用 study 方法!

二、製做動態庫

(1)製做步驟

動態庫有不少種,目前像 .tbd .dylib 這種的動態庫咱們沒法打包,只能打包 .framework 格式的動態庫。 系統默認設置的就是動態類型,而後就是將新添加的頭文件公開,整個流程和 .framework 靜態庫同樣,這裏就再也不贅述了。

(2)測試

建立一個項目來測試一下這個動態庫,直接拖入工程,引入頭文件,調用動態庫中的方法,而後編譯,編譯經過沒問題。 可是當咱們運行的時候,會報錯誤 "Reason:image not found",以下圖:

其實這是由於沒有將它添加到 Embedded 中,在老版本的 Xocde 中, Embedded 是單獨設置的,可是不知道從那一版 Xocde 開始, Embedded 和其餘設置合併在一塊兒了。如今咱們只須要在 "General => Frameworks, Libraries, and Embedded Content" 中,把 "Do Not Embed" 改成 "Embed & Sign" 便可,以下圖:
而後就能夠正常運行了!

以上就是對靜態庫和動態庫的簡單介紹,還有打包的流程,但願在你須要的時候能夠幫到你!

轉載請備註原文出處,不得用於商業傳播——凡幾多

相關文章
相關標籤/搜索