因?yàn)楣ぷ鞯男枰校蟹庋b過.framework靜態(tài)庫的經(jīng)驗(yàn)第晰,現(xiàn)在分享給大家碱茁,歡迎討論指教裸卫。(.a的我沒玩過~~~~~~)
概念
庫分為靜態(tài)庫和動(dòng)態(tài)庫,靜態(tài)庫庫一般以.a或者.framework為后綴名纽竣,而動(dòng)態(tài)庫的后綴一般為.tbd(以前是.dylib)和.framework,像系統(tǒng)的UIKit.framework墓贿,AVKit.framework都是動(dòng)態(tài)庫茧泪。
靜態(tài)庫調(diào)用時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝聋袋。
動(dòng)態(tài)庫調(diào)用時(shí)不會(huì)復(fù)制队伟,系統(tǒng)只加載一次,多個(gè)程序共用程序幽勒。運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存嗜侮,節(jié)省內(nèi)存。(但是I度荨锈颗!如果使用自己封裝的動(dòng)態(tài)庫,審核好像無法通過~~~~)
.framework的制作過程
a.先新建一個(gè)靜態(tài)庫的工程咪惠,命名MarsFrameworkDemo
可看見工程中自帶一個(gè).h文件
b.在deployment target設(shè)置靜態(tài)庫支持的最低版本击吱,然后把你封裝好的方法拉進(jìn)去。我這里拉進(jìn)去的是我之前寫得簡(jiǎn)單的頭像點(diǎn)擊功能遥昧。
c.選擇公開頭文件
為了讓使用者知道哪些方法可以調(diào)用姨拥,我們需要在MarsFrameworkDemo.h 中#import 需要公開的頭文件,并且要在Build Phases ->Headers中將公開的頭文件暴露出來(若你公開的頭文件中有import其他非系統(tǒng)類渠鸽,也要暴露出來叫乌,如果不想暴露,可在公開的頭文件中@class 其他類徽缚,再去.m文件中import 該類)
d.我們需要把target->Build Setting->Build Active Architecture Only修改為NO憨奸,否則生成的靜態(tài)庫就只支持當(dāng)前選擇設(shè)備的架構(gòu)。
e.修改Mach-O的格式凿试,不然封裝出來的庫將以動(dòng)態(tài)庫的形式存在排宰。將target->BuildSetting->Mach-o Type 設(shè)為Static Library(默認(rèn)為Dynamic Library)
f.選擇Generic ios Device 和任意一個(gè)模擬器分別運(yùn)行一次,可發(fā)現(xiàn)MarsFrameworkDemo.framework由紅色變成了黑色那婉。選擇show in finder
如果想要讓模擬器和真機(jī)通用一個(gè)靜態(tài)庫板甘,我們可以使用終端命令來實(shí)現(xiàn)。合并的命令與上面不同的是:framework靜態(tài)庫合并的不是framework,而是framework下的二進(jìn)制文件详炬,命令為:
cd product文件
lipo -create 第一個(gè)framework下二進(jìn)制文件的絕對(duì)路徑 第二個(gè)framework下二進(jìn)制文件的絕對(duì)路徑 -output 最終的二進(jìn)制文件路徑:
然后將任何一個(gè)framework中的二進(jìn)制文件替換成合并后的二進(jìn)制文件,然后把framework添加到要使用的項(xiàng)目中即可使用盐类。
注意:
如果靜態(tài)庫中有category類,則在使用靜態(tài)庫的項(xiàng)目配置中Other Linker Flags需要添加參數(shù)-ObjC或者-all_load呛谜。
如果創(chuàng)建的framework類中使用了.tbd在跳,則需要在實(shí)際項(xiàng)目中導(dǎo)入.tbd動(dòng)態(tài)庫。
新建一個(gè)工程隐岛,將靜態(tài)庫拖進(jìn)去猫妙,導(dǎo)入頭文件,就可以使用里面的方法了聚凹。
若打包的靜態(tài)庫依賴其他的第三方或者靜態(tài)庫割坠,用cocoapods處理或者取消勾選Target Membership