本文章內(nèi)容參考網(wǎng)絡(luò)上搜集到的資料豺总。本人只是整理以现,已被日后查看之用狠怨。原文地址:靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別约啊?
什么是庫(kù)?
庫(kù)是共享程序代碼的方式佣赖。
庫(kù)從本質(zhì)上來(lái)說(shuō)是一種可執(zhí)行代碼的二進(jìn)制格式恰矩,可以被載入到內(nèi)存中執(zhí)行。庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)憎蛤。
iOS中的靜態(tài)庫(kù)有.a和.framework兩種形式外傅;動(dòng)態(tài)庫(kù)有.dylib和.framework形式,后來(lái).dylib動(dòng)態(tài)庫(kù)又被蘋(píng)果替換成.tbd的形式俩檬。
靜態(tài)庫(kù):連接時(shí)完整地拷貝至可執(zhí)行文件中萎胰,被多次使用就有多份冗余拷貝。
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制棚辽,程序運(yùn)行時(shí)技竟,由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用屈藐,系統(tǒng)只加載一次榔组,多個(gè)程序公用,節(jié)省內(nèi)存估盘〈苫迹【iOS暫時(shí)只允許使用系統(tǒng)動(dòng)態(tài)庫(kù)】;
靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)是相對(duì)編譯期和運(yùn)行期的:靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中遣妥,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù)擅编;而動(dòng)態(tài)庫(kù)在編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,只是在程序運(yùn)行時(shí)才被載入箫踩,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在爱态。
總結(jié):同一個(gè)靜態(tài)庫(kù)在不同程序中使用時(shí),每一個(gè)程序中都得導(dǎo)入一次境钟,打包時(shí)也被打包進(jìn)去锦担,形成一個(gè)程序。而動(dòng)態(tài)庫(kù)在不同程序中慨削,打包時(shí)并沒(méi)有被打包進(jìn)去洞渔,只在程序運(yùn)行時(shí),才鏈接載入(如系統(tǒng)的框架UIKit缚态、Foundation等)磁椒,所以程序體積會(huì)小很多,但蘋(píng)果不讓使用自己的動(dòng)態(tài)庫(kù)玫芦,否則審核就無(wú)法通過(guò)浆熔。
framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)?
系統(tǒng)的.framework是動(dòng)態(tài)庫(kù)桥帆,我們自己建立的.framework是靜態(tài)庫(kù)医增。
.a與.framework有什么區(qū)別慎皱?
.a是一個(gè)純二進(jìn)制文件, .framework中除了二進(jìn)制文件之外還有資源文件叶骨。
.a文件不能直接使用茫多,至少要有.h文件配合, .framework文件可以直接使用邓萨。
.a + .h + sourceFile = .framework
建議使用.framework
為什么要使用靜態(tài)庫(kù)地梨?
方便共享代碼,便于合理使用缔恳。
實(shí)現(xiàn)iOS程序的模塊化宝剖。可以吧固定的業(yè)務(wù)模塊化成靜態(tài)庫(kù)歉甚。
和別人分享你的代碼庫(kù)万细,但是不想讓別人看到你代碼的實(shí)現(xiàn),開(kāi)發(fā)第三方SDK的需要纸泄。
制作靜態(tài)庫(kù)時(shí)的幾點(diǎn)注意:
1赖钞、注意理解:無(wú)論是.a靜態(tài)庫(kù)還是.framework靜態(tài)庫(kù),我們需要的都是二進(jìn)制文件+.h+其他資源文件的形式聘裁,不同的是雪营,.a本身就是二進(jìn)制文件,需要我們自己配上.h和其他文件才能使用衡便,而.framework本身已經(jīng)包含了.h和其他文件献起,可以直接使用。
2镣陕、圖片資源的處理谴餐,兩種靜態(tài)庫(kù),一般都是把圖片文件單獨(dú)存放在一個(gè).bundle文件中呆抑,一般.bundle的名字和.a或.framework的名字相同岂嗓。.bundle文件很好弄,新建一個(gè)文件夾鹊碍,把它改名為.bundle就可以了厌殉,右鍵,顯示包內(nèi)容就可以向其中添加圖片資源侈咕。
3年枕、category是我們實(shí)際開(kāi)發(fā)項(xiàng)目中經(jīng)常使用到的,把category打成靜態(tài)庫(kù)是沒(méi)有問(wèn)題的乎完,但是在這個(gè)靜態(tài)庫(kù)的工程中,調(diào)用category中的方法時(shí)會(huì)有找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized)品洛,解決辦法是:在靜態(tài)庫(kù)的工程中配置other linker flags的值為-ObjC树姨。
4摩桶、如果一個(gè)靜態(tài)庫(kù)很復(fù)雜,需要暴露的.h比較多的話帽揪,就可以在靜態(tài)庫(kù)的內(nèi)部創(chuàng)建一個(gè).h文件(一般這個(gè).h文件的名字和靜態(tài)庫(kù)的名字相同)硝清,然后把所有需要暴露出來(lái)的.h文件都集中放在這個(gè).h文件中,而那些原本需要暴露的.h都不需要再暴露了转晰,只需要把.h暴露出來(lái)就可以了芦拿。
創(chuàng)建.a靜態(tài)庫(kù)
第一步,新建工程查邢。一般使用工程名就使用庫(kù)的名稱(chēng)蔗崎,比如我們這里用jingtaiku來(lái)創(chuàng)建靜態(tài)庫(kù),我們的工程名就取為jingtaiku扰藕,創(chuàng)建的.a靜態(tài)庫(kù)就是jingtaiku.a缓苛。
第二步、導(dǎo)入需要打包的資源文件邓深,同時(shí)把資源文件需要外界訪問(wèn)的.h文件導(dǎo)入到系統(tǒng)推薦的.h文件中未桥。
第三部、真機(jī)芥备,模擬器編譯一下冬耿。就可以生成.a文件(必須先用真機(jī),要不然萌壳,不能生成)亦镶。
第四步、Xcode生成的.a文件默認(rèn)沒(méi)有導(dǎo)出.h文件讶凉。需要自己添加染乌。
第五步、導(dǎo)出你自己的靜態(tài)庫(kù)的配置
注意:如果第五步中懂讯,不降Build Configuration改為Release荷憋,則打包出來(lái)的靜態(tài)庫(kù)會(huì)存于【Debug-iPhoneos】和【Debug-iphonesimulator】?jī)蓚€(gè)文件夾下。我們一般都是使用Release模式褐望,因?yàn)槌绦蜃罱K會(huì)發(fā)布之后是Release版的勒庄,所以靜態(tài)庫(kù)也是在Release模式下使用。
第六步瘫里、合成模擬器的架構(gòu)【默認(rèn):模擬器只會(huì)生成對(duì)應(yīng)的1種架構(gòu)】
如果第六步這里实蔽,設(shè)置為YES,那么編譯出來(lái)的.a文件庫(kù)就只包含當(dāng)前設(shè)備的架構(gòu)谨读。
第七步局装、合并架構(gòu)【真機(jī)和模擬器】
真機(jī)和模擬器合并:
lipo -create 靜態(tài)庫(kù)1.a(路徑) 靜態(tài)庫(kù)2.a(路徑) -output 靜態(tài)庫(kù).a (你最好cd到工程目錄下,這樣導(dǎo)出的文件在你工程目錄下)
第八步、資源包的問(wèn)題
1铐尚、靜態(tài)庫(kù)的資源拨脉,都應(yīng)該放到后綴為.bundle的文件夾中-->避免文件與本地文件重名被覆蓋,導(dǎo)致加載資源文件出錯(cuò)宣增∶蛋颍【注:要加載bundle路徑】
2、靜態(tài)庫(kù)打包時(shí)爹脾,并不會(huì)打包資源文件 --> 需要手動(dòng)拖進(jìn)去