iOS 靜態(tài)庫封裝

靜態(tài)庫和動態(tài)庫

靜態(tài)庫和動態(tài)庫存在形式

  • 靜態(tài)庫:以.a 和 .framework為文件后綴名。
  • 動態(tài)庫:以.tbd(之前叫.dylib) 和 .framework 為文件后綴名。

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

  • 靜態(tài)庫:鏈接時會被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝。
  • 動態(tài)庫:鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,系統(tǒng)只加載一次,多個程序共用(如系統(tǒng)的UIKit.framework等),節(jié)省內(nèi)存。(注:在iOS8之前,程序中能夠通過兩種方式使用庫文件,即.a和framework。.a是靜態(tài)庫的方式,framework本質(zhì)上也是靜態(tài)庫的方式,只不過為了方便,將其打包為假的動態(tài)庫。真正的動態(tài)庫在iOS8之后。)

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

二者區(qū)別不大,.a是純二進制文件,.a文件不能單獨使用,至少要有.h文件配合,而.framework除了二進制文件外,還包含一些資源文件(頭文件,plist等),由于自身包含了頭文件,以.framework可以單獨使用。

對圖片資源和UI界面xib或nib文件的處理

.a和.framework兩種靜態(tài)庫,通常都是把需要用的到圖片或者xib文件存放在一個bundle文件中,而該bundle文件的名字和.a或.framework的名字相同。
.a文件中無法存放圖片或xib文件,很容易理解,但是.framework從本質(zhì)上說也是一個bundle文件,為什么不把圖片或者xib文件直接放在.framework中而單獨再創(chuàng)建個bundle文件呢?
那是因為iOS系統(tǒng)不會去描.framework下的圖片等資源文件,也不會在項目中顯示,也就是說即使放在 .framework目錄下,系統(tǒng)根本就不會去掃描,因此也無法發(fā)現(xiàn)使用。

category的處理

category是項目開發(fā)中經(jīng)常用到的,把category打包成靜態(tài)庫是沒有問題的,但是在使用這個靜態(tài)庫時,調(diào)用category中的方法時會發(fā)生找不到該方法的運行時錯誤(selector not recognized)解決的辦法如下:

  • 如果,第三庫中沒有 category,Other Linker Flags 無需設(shè)置
  • 如果,第三方庫中有 category,需要設(shè)置為 -ObjC
  • 如果,某些 Xcode 版本中,出現(xiàn)問題,修改設(shè)置為 -all_load

運行模式

arm7: 在最老的支持iOS7的設(shè)備上使用
arm7s: 在iPhone5和5C上使用
arm64: 運行于iPhone5S的64位 ARM 處理器 上
i386: 32位模擬器上使用
x86_64: 64為模擬器上使用
注意:向下兼容,arm7版本可以做arm7s上運行

.a靜態(tài)庫制作

1、新建項目-> 選擇 “Cocoa Touch Static Library”

1.png

2、添加庫需要包含的源代碼,將你工程里的代碼添加到打靜態(tài)庫工程里:

3、配置工程:

2.png

注:需要修改Build Settings中的 Build Active Architecture Only 以滿足運行不同CPU環(huán)境的模擬器。 將此設(shè)置為NO。
當(dāng)為YES的時候,在什么環(huán)境下編譯靜態(tài)庫就支持什么環(huán)境。

4、選擇需要暴露出來的 .h 文件, .m 文件會自動編譯到 .a 文件中:

3.png

注:在工程對應(yīng)的target的“Build Phases”下添加“Headers”的選項。該選項默認(rèn)是沒有的,添加方法是點擊下方的“Add BuildPhase”按鈕后選擇后即可添加。該選項下有3個子選項,分別是Public,Private,Project。通過點擊下方的加號,可以將工程中的頭文件添加到“Project”中,在其中的對應(yīng)頭文件點擊右鍵,選擇“Moveto PublicGroup”,當(dāng)頭文件移到“Public”后,編譯工程以后,在工程編譯后.a文件所在的路徑下,會同時出現(xiàn)一個"usr/local/include"的文件夾,其中的頭文件就是public group中的頭文件。這時只需將.a文件和這個路徑下的頭文件拷貝到所需工程文件即可。

5、編譯靜態(tài)庫
選擇真機設(shè)備,然后 Command+B 編譯,靜態(tài)庫文件從紅色變?yōu)楹谏?br> 選擇模擬器,然后 Command+B 編譯 ,靜態(tài)庫文件從紅色變?yōu)楹谏?br> 模擬器和真機環(huán)境下用的.a文件是分開的
選擇Scheme可以編譯出debug和release不同版本的靜態(tài)庫
如圖:

4.png

6、合并.a文件
如果想讓一個.a文件能同時用在真機和模擬器上,需要進行合并。
在終端輸入指令:
lipo -create 靜態(tài)庫路徑1 靜態(tài)庫路徑2 -output 靜態(tài)庫路徑3
路徑1和路徑2可以通過直接拖拽靜態(tài)庫文件獲取,路徑3為保存的路徑

通過lipo –info 靜態(tài)庫 可以查看 .a 的類型(模擬器還是真機)

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

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

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