iOS 創(chuàng)建靜態(tài)庫和動態(tài)庫

1.庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進制格式,可以被載入內(nèi)存中執(zhí)行。

庫分:

  • 靜態(tài)庫(.a和.framework)

  • 動態(tài)庫(.dylib和.framework)

2.framework為什么即是動態(tài)庫又是靜態(tài)庫?

因為系統(tǒng)的framework是動態(tài)庫,我們自己建立的framework是靜態(tài)庫

.a與.framework的區(qū)別

  • .a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件

  • .a文件不能自己使用,至少要和.h文件配合,.framework文件可以自己使用

  • .a + .h + soureFile = .framework

建議使用.framework

注意:項目中如果使用了自制的動態(tài)庫,不能被上傳到 AppStore

3.靜態(tài)庫和動態(tài)庫在使用上的區(qū)別

  • 靜態(tài)庫:鏈接時,靜態(tài)庫會被完整地復制到可執(zhí)行文件中, 被多次使用就有多份冗余拷貝 (左圖所示)

  • 動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存 (下圖所示)

動態(tài)庫和靜態(tài)庫的區(qū)別.png

4.為什么要使用靜態(tài)庫?

  • 方便代碼的共享和重復利用,可以吧固定我業(yè)務模塊化成靜態(tài)庫,在下次需要使用此功能的時候直接拖進工程

  • 和別人分享你的代碼庫,但是又不想讓別人看見你的代碼實現(xiàn)

在使用第三方sdk常見到

無論是.a靜態(tài)庫還是.framework靜態(tài)庫,我們都是需要的是二進制文件+.h+.其他資源文件的形式,只不過是.a文件本身就是二進制文件,需要我們自己配上.h和其他資源文件,而.framework本身包含了.h文件和其他文件,可以自己使用

5.圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內(nèi)容可以向其中添加圖片資源。

6.category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調(diào)用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC。

如果一個靜態(tài)庫很復雜,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。

(一)framework靜態(tài)庫的創(chuàng)建流程


xcode創(chuàng)建framework文件.png

8.點擊next后會出現(xiàn)下面文件

創(chuàng)建之后文件目錄.png
需要修改的配置.png

9.把需要公開的頭文件引入

把需要公開的文件導入.png

10.把需要公開的頭文件設為Public


把需要公開的頭文件設為Public.png
導入之后效果.png

11.分別選擇真機模式和模擬器模式(任意一個模擬器都可以),command + b編譯一下

分別編譯.png

12.編譯后會發(fā)現(xiàn)

編譯之后效果.png

13.選中framework,show in finder

找到編譯后的文件.png

14.會看到有兩個不同環(huán)境下生成的framework

真機和模擬器兩個場景下的文件.png

15.接下來就是合并這兩個環(huán)境的的靜態(tài)庫


需要拖拽的文件.png

打開終端輸入:

  • lipo -create
  • 第一個文件中MyLibrary文件的路徑拖入終端
  • 第二個文件中MyLibrary文件的路徑拖入終端
  • -output 生成新的文件的路徑(注意留空格)
  • 然后把新生成的替換第一個framework中的文件

此時一個可以在真機和模擬器下使用的靜態(tài)庫就創(chuàng)建好了

效果.png

將生成的MyLibrary替換任意一個framework中的MyLibrary就可以將此framework拿去使用了

(二).a靜態(tài)庫的創(chuàng)建

創(chuàng)建.a靜態(tài)庫.png

17.和創(chuàng)建framework是一樣的,剛開始因為不存在對應的靜態(tài)庫文件,因此會顯示紅色,當在編譯之后會由紅色變成黑色

創(chuàng)建文件.png

18.同樣需要修改的地方,此處是為了支持5c要添加黯然armv7s

支持5c.png

這里不需要改,因為默認的已經(jīng)改好


不需要更改配置.png

18.此處設置要公開的頭文件

需要公開的.h文件.png
效果.png

19.打開終端輸入:


需要拖拽的文件.png
  • lipo -create
  • 第一個文件中l(wèi)ibMyLibrary.a 文件的路徑拖入終端
  • 第二個文件中l(wèi)ibMyLibrary.a文件的路徑拖入終端
  • -output 生成新的文件的路徑(注意空格)
  • 然后把新生成的替換第一個framework中的文件

此時一個可以在真機和模擬器下使用的靜態(tài)庫就創(chuàng)建好了

.a文件和.framework的區(qū)別在于.a文件在拖入項目的時候要把對應的.h文件一起拖入

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容