概述
1斋否、 靜態(tài)庫和動態(tài)庫
存在方式
靜態(tài)庫: .a 和 .framework
動態(tài)庫: .dylib或者.tbd 和 .framework
二者的區(qū)別
靜態(tài)庫:鏈接時,靜態(tài)庫會被完整地復(fù)制 到 可執(zhí)行文件中拭荤, 缺點(diǎn): 【被多次使用茵臭,就有多份冗余拷貝】
動態(tài)庫:鏈接時不復(fù)制,程序運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存里舅世,供程序調(diào)用旦委,系統(tǒng)只加載一次!多個程序共享資源雏亚,節(jié)約內(nèi)存缨硝!
注意:由于我們自制的動態(tài)庫上傳AppStore不能審核通過,故我們用靜態(tài)庫來制作第三方SDK罢低。
2查辩、.a 靜態(tài)庫 和 .framework靜態(tài)庫的異同
- 共同點(diǎn):
最終都是 轉(zhuǎn)化為 二進(jìn)制文件 + .h 文件 + 其它文件,才能使用网持。 - 不同點(diǎn):
- .a 本身是一個二進(jìn)制文件宜岛,需要配上 .h 和其它資源文件才能使用。
- .framework 本身已經(jīng)包含了 .h 和其它資源文件功舀。說白了就是它包含了所有東西萍倡。
小結(jié):通過上面兩種方式的對比,我的建議是使用 .framework靜態(tài)庫的方式來制作第三方SDK辟汰。
3列敲、靜態(tài)庫的使用場景
國內(nèi)的企業(yè),掌握有核心技術(shù)帖汞,同時是又希望更多的程序員來使用其技術(shù)戴而,因此采用閉源的方式開發(fā)使用
例如:百度地圖,友盟翩蘸,JPush等在企業(yè)開發(fā)中所意,一些核心技術(shù)或者常用框架,出于安全性和穩(wěn)定性的考慮,也會提供靜態(tài)庫給程序員使用
4扁眯、制作靜態(tài)庫的一般步驟
- 新建一個靜態(tài)庫工程
- 將需要打包的類拖到工程
- 編譯(一般需要編譯連個版本:真機(jī)版本和模擬器版本壮莹,最后合并成一個)
- 將編譯好的.a+.h+.bundle或者.framework+bundle拖到工程里面使用
創(chuàng)建.framework或者.a(不包含第三方靜態(tài)庫)
1、 新建靜態(tài)庫工程姻檀。
2命满、導(dǎo)入已經(jīng)創(chuàng)建好文件
3、暴露頭文件
4绣版、修改一些工程配置
5胶台、分別在真機(jī)和模擬器下編譯一次
注意:
模擬器:iPhone4s~5 : i386 iPhone5s~6plus : x86_64
真機(jī):iPhone3gs~4s : armv7 iPhone5~5c : armv7s iPhone5s~6plus : arm64
如果第五步這里,設(shè)置為YES杂抽,那么編譯出來的.a靜態(tài)庫就只包含當(dāng)前設(shè)備的指令集诈唬。
舉個例子:如果我們選擇iPhone 5模擬器【Command+B】編譯,則編譯出來的.a靜態(tài)庫只能用iPhone4s5模擬器跑程序缩麸,用iPhone5s6plus铸磅,則會報找不到x86_64的libFMDB庫。
設(shè)置為NO杭朱,則會把所有指令集的都打包合并阅仔。
6、編譯后生成的文件
注意: 上圖在終端執(zhí)行的命令是:
lipo -create
第一個.a文件的絕對路徑 第二個.a文件的絕對路徑-output
最終的.a文件路徑弧械。
7八酒、 如果創(chuàng)建的framework中使用了category類,則在使用framework的項(xiàng)目配置中【Other Linker Flags】需要添加參數(shù)【-ObjC]或者【-all_load】刃唐。
8羞迷、如果采用.framework的方式,基本操作和.a差不多画饥,主要的不同之處在下圖所示之處
創(chuàng)建.framework或者.a(包含第三方靜態(tài)庫)
相對不包含第三方靜態(tài)庫的區(qū)別:
- 如果第三方靜態(tài)庫是.a形式的衔瓮,并且生成該.a的源文件是用c++來編寫的,則需要添加動態(tài)庫
libstdc++.tbd
荒澡。 - 如果第三方靜態(tài)庫是. framework形式的报辱,則需要show in finder ,將里面的二進(jìn)制文件和頭文件拖到我們的靜態(tài)庫工程中完成編譯单山。
- 最后,如果有bundle文件幅疼,則拖出和新生成的靜態(tài)庫文件放在一起米奸。