iOS 靜態(tài)庫Framework和.a
什么是庫
庫是共享程序代碼的方式指郁。庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行拷呆。在開發(fā)過程中闲坎,一些核心技術(shù)或者常用框架,出于安全性和穩(wěn)定性的考慮,不想被外界知道箫柳,所以會把核心代碼打包成庫手形,只暴露出頭文件以供使用。庫分靜態(tài)庫和動態(tài)庫兩種悯恍。今天說的是靜態(tài)庫库糠。
- 對于靜態(tài)庫而言,類似于一個編譯好的 .o的集合涮毫。在build的過程中瞬欧,只會參與鏈接的操作,鏈接器會將靜態(tài)庫中被使用的部分合并到可執(zhí)行文件中去罢防,用函數(shù)的實(shí)際地址來代替函數(shù)引用艘虎。
- 靜態(tài)庫形式:.a 和 framework
- .a 和 framework 有什么區(qū)別:
.a是一個純二進(jìn)制文件
framework 中除了有二進(jìn)制文件之外還有資源文件。
framework 文件可以直接使用咒吐。
.a + .h + sourceFile= .framework野建。所以創(chuàng)建靜態(tài)庫最好還是用.framework的形式。
Framework的創(chuàng)建
- 創(chuàng)建framework
創(chuàng)建后發(fā)現(xiàn)只有一個.h文件恬叹,這個文件類似.pch文件候生,是所有頭文件的集合,將你要創(chuàng)建的類導(dǎo)入在這個.h文件里
- 設(shè)置public 文件
設(shè)置你想要別人看到引用的對外.h文件
- 設(shè)置mach-Type绽昼,選擇static(靜態(tài))
- 設(shè)置target支持的版本號iOS 9.0 以上等唯鸭,配置支持armv7s,build active architecture only 設(shè)置為NO
- 運(yùn)行模擬器,然后再運(yùn)行真機(jī)硅确,點(diǎn)擊Products->show in find目溉,會看到兩個文件夾Debug-iphonesimulator和Debug-iphoneos。這是因?yàn)镕ramework模擬器和真機(jī)不同菱农,需要去合并成一個
lipo
lipo 是個很有用的命令缭付,主要用來查看庫支持的架構(gòu)以及合并拆分庫
lipo -info
查看剛才編譯的 Framework 庫在 debug 和 release 下支持的框架:
libo -create
上面生成的庫,要么是只支持模擬器的大莫,要么是只支持真機(jī)的蛉腌,那么如何才能又能兼顧真機(jī)和模擬器呢?-create去合并
使用方式:lipo -create 庫1(空格)庫2 -output 新庫名
.a 文件的創(chuàng)建
- 創(chuàng)建.a
創(chuàng)建后會生成一個.h 和 .m文件只厘,(無用可刪)烙丛,去創(chuàng)建NSObject類對象
-
修改subpath,保持創(chuàng)建的文件和.a 文件在同一個文件夾下,其次再copyFiles下羔味,導(dǎo)入需要暴露的.h文件
subpath.png 與framework設(shè)置相同河咽,設(shè)置mach-type,運(yùn)行模擬器赋元,合并.a文件
靜態(tài)文件調(diào)用
- .framework調(diào)用:拖入后綴是.framework加進(jìn)項(xiàng)目就OK了
- .a調(diào)用:拖入.a和.h文件加進(jìn)項(xiàng)目
模擬器i386忘蟹,x86_64,arm7,arm7s,arm64
- 模擬器架構(gòu):
i386 : 32位架構(gòu) 4S ~ 5
x86_64 : 64位架構(gòu) 5S ~ 現(xiàn)在的機(jī)型
- 真機(jī)架構(gòu):
arm7: 在最老的支持iOS7的設(shè)備上使用
arm7s: 在iPhone5和5C上使用
arm64: 運(yùn)行于iPhone5S的64位 ARM 處理器 上