什么是庫?
庫是共享程序代碼的方式,一般分為動態(tài)庫和靜態(tài)庫。
- 靜態(tài)庫:.a和.framework
- 動態(tài)庫:.dylib和.framework
在實際的項目開發(fā)中,經(jīng)常會使用到庫,庫分為靜態(tài)庫和動態(tài)庫兩種。和多數(shù)人所熟悉的動態(tài)語言和靜態(tài)語言一樣,這里的所謂靜態(tài)和動態(tài)是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標代碼中,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在。
靜態(tài)庫和動態(tài)庫區(qū)別
- 靜態(tài)庫:鏈接時,靜態(tài)庫會被完整的復制到可執(zhí)行文件中,被多次使用就又多份冗余拷貝
- 動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內存,供程序調用,系統(tǒng)只會加載一次,多個程序共用,節(jié)省內存
注意:項目中如果使用了自制的動態(tài)庫(framework)不能被上傳到AppStore
.a和.framewrok有什么區(qū)別?
- .a是一個純二進制文件,.framework是一個文件夾,文件夾中除了有二進制文件之外還有資源文件。* .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。* .a + .h + sourceFile = .framework。
靜態(tài)庫的應用場景
- 希望更多的開發(fā)者在程序中集成,但是又不想公布自己的核心技術;對外暴露統(tǒng)一接口,開發(fā)者調用靜態(tài)庫即可。
- 項目開發(fā)中有一部分核心代碼,非核心開發(fā)人員倘若離職,對于公司來說是一種損失
1. a靜調庫的編譯
1.靜態(tài)庫的創(chuàng)建:左側為.framework 右側為.a

2.創(chuàng)建工具類,并暴露接口新建工具類,并在buildPhrase中添加需要暴露的.h文件

3.分別在不同的環(huán)境下編譯,從而得到支持不同環(huán)境的靜調庫

4.查看不同環(huán)境下的靜態(tài)庫

在不同的文件夾下可以查看不同環(huán)境使用的.a靜調庫文件,新建項目,將.a文件拖拽到項目中估計可使用

靜態(tài)庫中的架構問題
當使用真機環(huán)境的.a文件在模擬中編譯或者運行時,會報架構的錯誤 。
設備的CPU架構
不同的設備使用的CPU不同
CPU的不同就造成使用的CPU架構(即指令集)不同
-
靜態(tài)庫有其支持的CPU架構
- 如果靜態(tài)庫在其不支持的CPU架構上面運行就會報錯
模擬器使用的CPU架構
iPhone4s-iPhone5:i386
iPhone5s-iPhone6Plus:x86_64
真機使用的CPU架構
iPhone3gs-iPhone4sP:armv7
iPhone5-iPhone5c:armv7s
iPhone5s-iPhone6plus:arm64
注意: 支持armv7的靜態(tài)庫可以在armv7s上正常使用* 查看靜態(tài)庫的架構(終端命令)
$ lipo -info 靜態(tài)庫地址合并靜態(tài)庫
$ lipo create 靜態(tài)庫1 靜態(tài)庫2 output 合并后的靜態(tài)庫
如何使靜調庫支持多種CPU架構
想要制作的靜態(tài)庫既支持i386架構也支持x86_64架構,有兩種解決方法.
-
修改靜態(tài)庫的編譯環(huán)境并重新編譯
6.png
在termnal中使用命令將多個靜態(tài)庫合并
$ lipo -create Debug-iphoneos/libStaticLibrary.a Debug-iphonesimulator/libStaticLibrary.a -output libnewstatic.a
合并后的靜調庫的大小>=合并之前靜態(tài)庫大小之和
開發(fā)環(huán)境:需要支持真機以及模擬器的靜態(tài)庫
生產(chǎn)環(huán)境:只需要支持真機的靜態(tài)庫即可
2 .framework靜態(tài)庫的編譯
第一步與.a文件文件創(chuàng)建一樣,選擇framework,點開以后發(fā)現(xiàn),項目中已經(jīng)存在一個與項目名稱一樣的主頭文件(這是蘋果推薦的方式 )
1.將需要暴露的頭文件添加到public(拖入即可)

注意:將需要暴露的頭文件放到主頭文件中
2.步驟跟.a文件一致,分別在真機以及模擬器環(huán)境編譯,得到兩個不同環(huán)境的.framework

3.使用.framework并運行

查看控制臺發(fā)現(xiàn)報錯,發(fā)現(xiàn)制作的framework為動態(tài)庫,動態(tài)庫的使用,需要在target中手動添加動態(tài)庫。(只能作為測試使用,蘋果禁止自制的動態(tài)庫上架,上架前切記修改為靜態(tài)庫)
4.修改編譯環(huán)境,編譯靜態(tài)庫buildsetting 搜索mach 并修改

使用該方法制作的靜態(tài)庫,可以運行,但是在4s中是無法運行的,會報CPU架構的錯誤,通過$lipo -info StaticFramework查看framework所支持的架構,目前這樣制作的framework只支持x86架構,因此4s不能運行** 注意 :**cd 到.framework的路徑是不夠的,因為僅僅是一個文件夾,真正的靜態(tài)庫是一個二進制文件.因此查看架構信息的時候需要跟這個靜態(tài)庫名字修改架構,使制作的framework支持所有架構

靜調庫的合并與.a文件一樣,在此就不做贅述。至此SDK的開發(fā)就到此為止,真正的SDK開發(fā)需要在項目中一邊開發(fā)一邊調試
3 SDK靜調庫的調試
單獨進行核心代碼SDK的開發(fā),開發(fā)完成以后需要拖到項目中調試,這樣是本末倒置的。SDK的開發(fā)需要在項目中調試以及開發(fā)。

創(chuàng)建完成以后,項目中的結構發(fā)生變化,變化的位置已經(jīng)已經(jīng)圈出

在framework文件目錄下創(chuàng)建核心代碼類,并在項目中需要的地方import主頭文件,靜調庫的制作就不贅述了,與上面的一致。
4 制作靜態(tài)庫時注意的幾點:
- 圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。
- category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC -all_load
