靜態(tài)庫和動態(tài)庫
靜態(tài)庫和動態(tài)庫存在形式
- 靜態(tài)庫:以.a 和 .framework為文件后綴名。
- 動態(tài)庫:以.tbd(之前叫.dylib) 和 .framework 為文件后綴名。
靜態(tài)庫和動態(tài)庫的區(qū)別
- 靜態(tài)庫:鏈接時會被完整的復制到可執(zhí)行文件中该酗,被多次使用就有多份拷貝。
- 動態(tài)庫:鏈接時不復制窖剑,程序運行時由系統(tǒng)動態(tài)加載到內存药版,系統(tǒng)只加載一次韭畸,多個程序共用(如系統(tǒng)的UIKit.framework等)畜晰,節(jié)省內存砾莱。(注:在iOS8之前,程序中能夠通過兩種方式使用庫文件凄鼻,即.a和framework腊瑟。.a是靜態(tài)庫的方式聚假,framework本質上也是靜態(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從本質上說也是一個bundle文件避诽,為什么不把圖片或者xib文件直接放在.framework中而單獨再創(chuàng)建個bundle文件呢龟虎?
那是因為iOS系統(tǒng)不會去描.framework下的圖片等資源文件,也不會在項目中顯示沙庐,也就是說即使放在 .framework目錄下鲤妥,系統(tǒng)根本就不會去掃描,因此也無法發(fā)現(xiàn)使用拱雏。
category的處理
category是項目開發(fā)中經常用到的棉安,把category打包成靜態(tài)庫是沒有問題的,但是在使用這個靜態(tài)庫時铸抑,調用category中的方法時會發(fā)生找不到該方法的運行時錯誤(selector not recognized)解決的辦法如下:
- 如果贡耽,第三庫中沒有 category,Other Linker Flags 無需設置
- 如果鹊汛,第三方庫中有 category蒲赂,需要設置為 -ObjC
- 如果,某些 Xcode 版本中刁憋,出現(xiàn)問題滥嘴,修改設置為 -all_load
運行模式
arm7: 在最老的支持iOS7的設備上使用
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)境的模擬器是尖。 將此設置為NO意系。
當為YES的時候,在什么環(huán)境下編譯靜態(tài)庫就支持什么環(huán)境饺汹。
4蛔添、選擇需要暴露出來的 .h 文件, .m 文件會自動編譯到 .a 文件中:
注:在工程對應的target的“Build Phases”下添加“Headers”的選項兜辞。該選項默認是沒有的迎瞧,添加方法是點擊下方的“Add BuildPhase”按鈕后選擇后即可添加。該選項下有3個子選項逸吵,分別是Public,Private,Project凶硅。通過點擊下方的加號,可以將工程中的頭文件添加到“Project”中扫皱,在其中的對應頭文件點擊右鍵足绅,選擇“Moveto PublicGroup”,當頭文件移到“Public”后韩脑,編譯工程以后氢妈,在工程編譯后.a文件所在的路徑下,會同時出現(xiàn)一個"usr/local/include"的文件夾段多,其中的頭文件就是public group中的頭文件首量。這時只需將.a文件和這個路徑下的頭文件拷貝到所需工程文件即可。
5进苍、編譯靜態(tài)庫
選擇真機設備加缘,然后 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 的類型(模擬器還是真機)