所謂的庫就是一些程序代碼的集合颜矿。庫是已經編譯好的二進制文件茴丰,編譯時只需要鏈接一下困介,節(jié)省了編譯時間。
庫分為靜態(tài)庫和動態(tài)庫兩種铃诬。
靜態(tài)庫
以".a"或者".framework"為文件后綴名
靜態(tài)庫鏈接時會被完整的復制到可執(zhí)行文件中祭陷,被多次使用就有多份拷貝。
動態(tài)庫
以".dylib"或者".framework"為文件后綴名
動態(tài)庫鏈接時不復制氧急,程序運行時由系統(tǒng)動態(tài)加載到內存颗胡,供程序調用。而且系統(tǒng)只加載一次吩坝,多個程序共用毒姨,節(jié)省內存。
.a文件和.framework文件的區(qū)別
.a是一個純二進制文件钉寝,不能直接拿來使用弧呐,需要配合頭文件、資源文件一起使用嵌纲。將靜態(tài)庫打包的時候俘枫,只能打包代碼資源,圖片逮走、本地json文件和xib等資源文件無法打包進去鸠蚪,使用.a靜態(tài)庫的時候需要三個組成部分:.a文件+需要暴露的頭文件+資源文件;
.framework中除了有二進制文件之外還有資源文件师溅,可以拿來直接使用茅信。
制作靜態(tài)庫需要注意的幾點:
1.無論是.a靜態(tài)庫還.framework靜態(tài)庫,我們需要的都是二進制文件+.h+其它資源文件的形式墓臭,不同的是蘸鲸,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用窿锉,而.framework本身已經包含了.h和其它文件酌摇,可以直接使用。
2.圖片資源的處理:兩種靜態(tài)庫嗡载,一般都是把圖片文件單獨的放在一個.bundle文件中窑多,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄洼滚,新建一個文件夾埂息,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源耿芹。
3.category是我們實際開發(fā)項目中經常用到的,把category打成靜態(tài)庫是沒有問題的挪哄,但是在用這個靜態(tài)庫的工程中吧秕,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linkerflags的值為-ObjC迹炼。
4.如果一個靜態(tài)庫很復雜砸彬,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同)斯入,然后把所有需要暴露出來的.h文件都集中放在這個.h文件中砂碉,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了刻两。
注:我們開發(fā)的iOS Framework多為靜態(tài)的增蹭,還是需要拷貝到目標程序中的。系統(tǒng)大部分Framework框架都是動態(tài)鏈接庫的形式磅摹,不需要拷貝到目標程序中滋迈。因為只有蘋果才能在iOS設備上安裝動態(tài)庫。當然户誓,由于Swift 的運行庫沒有被包含在 iOS 系統(tǒng)中饼灿,而是會打包進 App 中,所以Swift支持動態(tài) Framework帝美。
iOS設備的CPU架構
模擬器:32位處理器:i386架構碍彭, 64位處理器:x86_64架構
真機:32位處理器:armv7或者armv7s架構, 64位處理器:arm64架構
以Xcode8.3.2為例
.a文件靜態(tài)庫打包
1.新建工程TestA
2.實現(xiàn)你想要打包的工程
注:工程自帶一個類TestA(你也可以刪除這個類悼潭,自己添加)庇忌。
這里我添加一個 - (void)test; ,因為這個方法需要在外部被調用女责,所以一定要在.h中聲明漆枚。
.m中實現(xiàn)
- (void)test {
NSLog(@"打包.a小小小demo");
}
到此,我們的小功能就集成了
3.運行工程
在模擬器和真機狀態(tài)下分別運行
4.合并文件
點擊show in finder抵知,你會看到打包好的.a文件墙基,如圖,Debug-iphoneos是真機下的文件刷喜,Debug-iphonesimulator是模擬器下的文件残制。注,真正的項目中一般是打包Release版本掖疮。因為打包好的文件需要在模擬器和真機上都可以使用初茶,所以需要我們合并兩種運行狀態(tài)下的靜態(tài)庫。
合成靜態(tài)庫
cd 到Products目錄下浊闪,
輸入合并語句(注意空格)
lipo -create XXX/Products/Debug-iphonesimulator/libTestA.a XXX/Products/Debug-iphoneos/libTestA.a -output libTestA.a
到此恼布,就靜態(tài)庫就制作完了
5.導入工程
把剛剛合并完的.a文件和include下的.h文件導入使用的工程螺戳,導入頭文件就可以使用了
. framework文件靜態(tài)庫打包
其實打包.framework和打包.a類似。
1.新建工程TestFramework
2.功能集成
這里我把剛才的.a導進來使用
TestFramework.h為所有文件的公共頭文件
3.接下來就是運行合并生成靜態(tài)庫
步驟和.a的相同折汞,前面的不在重復介紹倔幼。
lipo -create 真機 模擬器 -output TestFramework.framework
注:
1).打包前要把動態(tài)庫改成靜態(tài)庫
2).系統(tǒng)默認只暴露TestFramework.h 頭文件,需要自己導入其他需要的
到此爽待,.framework就打包完成损同,導入工程就可以使用了
更多
http://www.cnblogs.com/Jenaral/p/5530383.html
http://www.reibang.com/p/87c2ad217958