一坛怪、庫的分類:
1. 開源庫 -》 公開代碼袜匿,能看到具體是怎么實(shí)現(xiàn)的居灯,如:SDWebImage/AFNetworking
2.閉源庫 -》 不公開代碼怪嫌,經(jīng)過編譯后的二進(jìn)制文件即是無.m文件柳沙,只有.h文件(靜態(tài)庫偎行、動(dòng)態(tài)庫)
如:靜態(tài)庫:.framework和.a
動(dòng)態(tài)庫:.dylib和.framework(iOS9 取消了.dylib蛤袒,使用.tbd代替)
2.1妙真、動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別:
靜態(tài)庫:鏈接時(shí),靜態(tài)庫會被完整的復(fù)制到可執(zhí)行文件中矗漾,被多次使用就有多份拷貝
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制薄料,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存。供程序調(diào)用誊役,系統(tǒng)只加載一次蛔垢,多程序共用鹏漆,節(jié)省內(nèi)存
注意:如果項(xiàng)目用到自制的動(dòng)態(tài)庫甫男,則無法上架到蘋果商店
.a靜態(tài)庫
二、制作.a靜態(tài)庫:
1-> .a靜態(tài)庫
1.1 默認(rèn)會創(chuàng)建兩個(gè)文件編寫邏輯代碼,到時(shí)候真正開發(fā)中會有很多的代碼邏輯感混,所以我們可以創(chuàng)建更多的文件
1.2 我們編寫了無數(shù)很復(fù)雜的邏輯代碼后弧满,(分別在模擬器和真機(jī))command + B
1.2.1 我們show in finder 以下的文件庭呜,如圖:
1.3 我們就可以看到兩個(gè)文件,一個(gè)是模擬器的数冬,一個(gè)是真機(jī)的 拐纱, Debug-文件
我們可以發(fā)現(xiàn)目前只有一個(gè).h文件秸架,但是在真正的開發(fā)中肯定有很多.h的文件
經(jīng)過以上的步驟你就可以暴露你的.h文件給別人使用了
三币绩、測試.a靜態(tài)庫:
1.將上面創(chuàng)建的Debug-iphonesimulator / Debug-iphoneos的其中一個(gè)放入項(xiàng)目(順便創(chuàng)建一個(gè)測試項(xiàng)目)缆镣,使用.a靜態(tài)庫的方法董瞻,編譯
報(bào)了一堆的錯(cuò)誤钠糊,但是使用真機(jī)編譯的時(shí)候則無錯(cuò)誤抄伍,同樣截珍,用模擬器的架構(gòu)編譯真機(jī)也會報(bào)錯(cuò)箩朴,但是用模擬器編譯則不會炸庞,原因是找不到對應(yīng)的架構(gòu)埠居,所以報(bào)錯(cuò)
報(bào)如下的問題:
Undefined symbols for architecture arm64: 或者 linker command failed with exit code 1 (use -v to see invocation)
原因:靜態(tài)庫的架構(gòu)不對滥壕,真機(jī)/模擬器
解決辦法:檢查第三方類庫的架構(gòu)版本 真機(jī)/模擬器
模擬器架構(gòu):
i386 : 4s / 5 目前已經(jīng)沒有該模擬器了捏浊,所以用模擬器編譯的架構(gòu)都是x86_64
x86_64 : 5s ---> xs max
真機(jī)架構(gòu)
armv7: 4 / 4s
armv7s: 5 / 5c 最特殊的一代 默認(rèn)已經(jīng)不支持了
arm64: 5s ---> xr max
2.查看靜態(tài)庫的架構(gòu)
根據(jù)上面的方法就可查詢到該靜態(tài)庫的架構(gòu)
用友盟的的QQ分享靜態(tài)庫對比一下
很明顯友盟的靜態(tài)庫有很多種的架構(gòu)浊洞,友盟的靜態(tài)庫可以在模擬器和真機(jī)編譯就是這個(gè)這個(gè)原因法希,所以我們要合成.a靜態(tài)庫的所有架構(gòu)
3.合成所有靜態(tài)庫的架構(gòu)
打開終端 cd 到架構(gòu)的上一個(gè)目錄苫亦,如圖:
然后輸入命令行 : lipo -create 靜態(tài)庫1.a 靜態(tài)庫2.a -output 新靜態(tài)庫.a (如上圖所示3.3.1.png)
運(yùn)行完命令行之后屋剑,我們可以發(fā)現(xiàn)Products文件夾下面多出了一個(gè) 新靜態(tài)庫.a 文件(如圖所示3.3.2.png)
查看xxx.a文件的架構(gòu)唉匾,如圖:
因?yàn)樯厦娴囊呀?jīng)說過5s以后的機(jī)型都是同一個(gè)架構(gòu)厂财,但是如果有需求要支持5s 以下的機(jī)型峡懈,可以使用以下的方法進(jìn)行編譯肪康,再合并
完成上面兩步就可以創(chuàng)建兩種模擬器架構(gòu),三種真機(jī)架構(gòu)齐唆,然后合并架構(gòu)冻河,就能合成與友盟QQ分享一樣的包含5種架構(gòu)的靜態(tài)庫
三叨叙、.a靜態(tài)庫的問題:
1.靜態(tài)庫包含的架構(gòu)越多則.a靜態(tài)庫就越大擂错,所以有一些的第三方框架就會出現(xiàn)發(fā)布版本(真機(jī))和測試版(模擬器版)
2.資源包問題,場景:項(xiàng)目中有一張YJphoto.png圖片昨凡,靜態(tài)庫中也有一張YJphoto.png圖片便脊,然后在項(xiàng)目中引用靜態(tài)庫中(UIImage *)getImage方法
+(UIImage *)getImage; //暴露給別人的方法
+(UIImage *)getImage //實(shí)現(xiàn)方法
{
return [UIImage imageNamed:@"YJphoto"];
}
執(zhí)行的效果就是使用項(xiàng)目中的YJphoto.png圖片哪痰,而不是使用靜態(tài)庫中的YJphoto.png圖片晌杰。所以我們在靜態(tài)庫中不可以直接使用YJphoto.png圖片镇饺,而是使用資源庫(.bundle)的方法來調(diào)用圖片,
+(UIImage *)getImage //實(shí)現(xiàn)方法
{
return [UIImage imageNamed:@"xxx.bundle/YJphoto"];
}
四奸笤、.a靜態(tài)庫邊開發(fā)邊調(diào)試:
1.在實(shí)際開發(fā)中不可能編譯一次生成靜態(tài)庫监右,然后再把靜態(tài)庫導(dǎo)入項(xiàng)目健盒,這樣做太麻煩了扣癣,所以本文在這里提示使用邊開發(fā)邊調(diào)試
2.創(chuàng)建普通項(xiàng)目父虑,然后
創(chuàng)建和編寫完成之后呜魄,command + B 會報(bào)一個(gè)錯(cuò)誤爵嗅,
該錯(cuò)誤上面已經(jīng)提及過了睹晒,所以我直接給解決辦法
完成這幾步岔激,編譯就可以成功了
3.邊開發(fā)邊調(diào)試總結(jié)
3.1 按照常規(guī)創(chuàng)建項(xiàng)目即可
3.2開發(fā)靜態(tài)庫 --》 添加target
3.3使用時(shí)虑鼎,頭文件及方法正常調(diào)用炫彩,編譯運(yùn)行時(shí)江兢,一定要記得導(dǎo)入.a文件
4.邊開發(fā)邊調(diào)試區(qū)別
4.1 如果使用此種方式進(jìn)行開發(fā)丁频,實(shí)際上靜態(tài)庫文件根本沒有被編譯席里,直接可以使用
4.2如果要導(dǎo)出奖磁,還是需要按照以前的方式進(jìn)行編譯咖为,注意要切換target
.framework靜態(tài)庫
零秕狰、
Xcode6開始,才有了Framework工程模板躁染,以前基本上都是使用.a鸣哀,現(xiàn)在的大部分的第三方都是使用Framework靜態(tài)庫(如:百度、支付寶等等),在Xcode6以前吞彤,也可以制造Framework,但是需要去Github上下載模板文件(使用率很低我衬,在Xcode6出現(xiàn)后,此模板文件不再更新)
一备畦、創(chuàng)建framework靜態(tài)庫
其實(shí)framework和.a靜態(tài)庫開發(fā)很相似许昨,也是要分架構(gòu)的懂盐,不明白可以參考上面的.a靜態(tài)庫開發(fā)
區(qū)別:
1.導(dǎo)出頭文件,跟.a不一樣糕档。需要將公開的頭文件移到Public下(如下圖1-1.png莉恼,1-2.png)
2.制作的Framework拌喉,默認(rèn)是動(dòng)態(tài)庫文件(無法上架AppStore)
3.自己制作的動(dòng)態(tài)庫使用,需要添加Embedder Binarier -----> 此選項(xiàng)的意思就是將來的動(dòng)態(tài)庫文件代碼轉(zhuǎn)換成二進(jìn)制文件俐银,此時(shí)就無關(guān)動(dòng)態(tài)還是靜態(tài)了(如下圖3-1.png)
4.因?yàn)閯?dòng)態(tài)庫上架不了AppStore尿背,所以要將動(dòng)態(tài)庫轉(zhuǎn)換成靜態(tài)庫,去bulid Setting中搜索Mach-O type 修改成Static(如下圖4-1.png)
5.靜態(tài)庫直接使用即可捶惜,不需要設(shè)置Embedder Binarier
二田藐、邊開發(fā)邊調(diào)試framework
1.與.a靜態(tài)庫邊調(diào)試邊開發(fā)差不多,在調(diào)試時(shí)也不區(qū)分動(dòng)態(tài)還是靜態(tài)
2.頭文件吱七,不需要使用<>汽久,還是使用常規(guī)的“”
3.因?yàn)闆]有生成靜態(tài)庫/動(dòng)態(tài)庫,所以不需要手動(dòng)設(shè)置編譯二進(jìn)制的選項(xiàng)