靜態(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”

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

注:需要修改Build Settings中的 Build Active Architecture Only 以滿足運行不同CPU環(huán)境的模擬器。 將此設(shè)置為NO。
當(dāng)為YES的時候,在什么環(huán)境下編譯靜態(tài)庫就支持什么環(huán)境。
4、選擇需要暴露出來的 .h 文件, .m 文件會自動編譯到 .a 文件中:

注:在工程對應(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)庫
如圖:

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 的類型(模擬器還是真機)