靜態(tài)庫
1. 靜態(tài)庫簡(jiǎn)介
-
什么是庫?
庫 就是程序代碼的集合, 是共享程序代碼的一種方式 -
庫的分類?
> 開源庫 公開源代碼, 能看到具體實(shí)現(xiàn) 例如SDWebImage, MJRefresh, AFNetworking... > 閉源庫 不公開源代碼, 是經(jīng)過編譯后的二進(jìn)制文件, 看不到具體實(shí)現(xiàn),只暴露.h文件 主要分為: 靜態(tài)庫 和 動(dòng)態(tài)庫 -
靜態(tài)庫的存在形式?
.a .framework -
動(dòng)態(tài)庫的存在形式?
.dylib .framework -
靜態(tài)庫和靜態(tài)庫的區(qū)別?
> 靜態(tài)庫在鏈接時(shí), 會(huì)被完整的復(fù)制到可執(zhí)行文件中; 被多次使用, 就有多份拷貝; > 動(dòng)態(tài)庫則不會(huì)復(fù)制, 只有一份. 程序運(yùn)行時(shí)動(dòng)態(tài)加載到內(nèi)存; 系統(tǒng)只加載一次, 多個(gè)程序共用, 節(jié)省內(nèi)存; > 但是!!!! 項(xiàng)目中如果使用到自己的動(dòng)態(tài)庫, 不允許上架! > 不過WWDC2014上公布的 蘋果對(duì)ios8開放動(dòng)態(tài)加載dylib的接口,也就是說開放了動(dòng)態(tài)庫掛載 -
靜態(tài)庫應(yīng)用場(chǎng)景?
> 保護(hù)自己的核心代碼 國(guó)內(nèi)的企業(yè),掌握有核心技術(shù),同時(shí)是又希望更多的程序員來使用其技術(shù),因此采用"閉源"的方式開發(fā)使用,如百度地圖,友盟等 > 將MRC的項(xiàng)目,打包成靜態(tài)庫, 可以在ARC下直接使用, 不需要轉(zhuǎn)換 設(shè)置Objective-C Automatic Reference Counting -> NO
2. 靜態(tài)庫和動(dòng)態(tài)庫的制作
-
注意事項(xiàng):
> 模擬器下的靜態(tài)庫和真機(jī)下的靜態(tài)庫不能共用 -
注意靜態(tài)庫所支持的架構(gòu)
不同機(jī)型的CPU, 對(duì)應(yīng)的架構(gòu)不同; 模擬器: 4s----5 : i386 5s----6sPlus : x86_64 真機(jī): 3gs---4s : armv7 5/5c : armv7s(armv7兼容armv7s) 5s---6sPlus: arm64 查看靜態(tài)庫支持的架構(gòu)
lipo -info 庫文件-
合并靜態(tài)庫(模擬器和真機(jī)都支持)
lipo -create 庫1 庫2 -output 終極庫
3 .a靜態(tài)庫和.framework靜態(tài)庫的區(qū)別?
1> .a是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件
2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
3> .a + .h + sourceFile = .framework
4> 打包靜態(tài)庫建議使用.framework
4. 靜態(tài)庫開發(fā)中的常見問題
問題1: 有些第三方庫會(huì)使用到一些圖片素材,例如公司的logo等。
由于Xcode默認(rèn)在編譯時(shí)會(huì)把所有的素材文件導(dǎo)入到mainBundle中,直接將文件資源拖到靜態(tài)庫或者新建文件夾保存素材文件的方式,最終可能與使用靜態(tài)庫的程序沖突。
在靜態(tài)庫中如果要使用圖片素材,會(huì)利用bundle的手段,步驟:
1> 建立bundle,并且向其中添加圖片
2> 創(chuàng)建一個(gè)類方法,返回圖片
3> 編譯
4> 調(diào)用方如果需要使用,需要導(dǎo)入 .h + .a + XXX.bundle
問題2: 如果用戶需要導(dǎo)入的頭文件過多怎么加?
建議使用一個(gè)主頭文件包含其他頭文件,讓用戶只導(dǎo)入一個(gè)主頭文件
問題3: 靜態(tài)庫程序怎樣測(cè)試?
靜態(tài)庫本身就是一個(gè)小項(xiàng)目,實(shí)現(xiàn)某些功能,但是這些功能在開發(fā)中也需要測(cè)試.而測(cè)試代碼又不能作為靜態(tài)庫的一部分
解決方案:創(chuàng)建復(fù)合項(xiàng)目,可參考->2.靜態(tài)庫和動(dòng)態(tài)庫的制作圖解中->四、靜態(tài)庫使用中的一些注意點(diǎn)
5. 補(bǔ)充: swift動(dòng)態(tài)庫打包以及使用
補(bǔ)充: swift支持動(dòng)態(tài)庫打包以及使用,不支持靜態(tài)庫。動(dòng)態(tài)庫的打包同上述->2.靜態(tài)庫和動(dòng)態(tài)庫的制作圖解中->五、動(dòng)態(tài)庫的制作。
swift暴漏接口, 需要使用public關(guān)鍵字