靜態(tài)庫(kù) VS 動(dòng)態(tài)庫(kù)
靜態(tài)庫(kù):靜態(tài)庫(kù)在Objective-C里面以.a或者.framework作為后綴赂弓,目前開發(fā)者自己創(chuàng)建的庫(kù)文件(Framework)其實(shí)都是以靜態(tài)庫(kù)的形式鏈接到執(zhí)行文件的探越。鏈接時(shí)完整的拷貝到了可執(zhí)行文件中,被多次使用就會(huì)有多份拷貝(eg:iOS8+的Extention中使用)腐螟。靜態(tài)庫(kù)文件一般都會(huì)比較大愿汰,因?yàn)樗幸褂玫臄?shù)據(jù)都會(huì)被編譯進(jìn)去困后,而且如果庫(kù)文件的某個(gè)函數(shù)改變了,那么就又需要重新編譯新的庫(kù)文件了衬廷,優(yōu)點(diǎn)就是編譯后的執(zhí)行程序不需要外部的函數(shù)庫(kù)支持摇予,因?yàn)樗械暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。
動(dòng)態(tài)庫(kù):動(dòng)態(tài)庫(kù)在Objective-C里面以dylib或者.framework最為后綴吗跋,系統(tǒng)為我們提供的framework就是動(dòng)態(tài)庫(kù)侧戴,目前開發(fā)者是不允許使用動(dòng)態(tài)庫(kù)的,因?yàn)槲覀冏约簞?chuàng)建的庫(kù)文件雖然buildSetting中的Mach-O
Type設(shè)置為Dynamic
Library跌宛,但是使用時(shí)直接鏈接到程序里面的酗宋,而不是放在服務(wù)器上進(jìn)行更新,開發(fā)者如果使用動(dòng)態(tài)庫(kù)放在服務(wù)器上疆拘,然后動(dòng)態(tài)的加載dlopen是不會(huì)通過(guò)審核的蜕猫,不然Apple的審核就沒有意義了。動(dòng)態(tài)庫(kù)在鏈接時(shí)不復(fù)制哎迄,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存回右,系統(tǒng)只加載一次,多個(gè)程序間共用漱挚,節(jié)省內(nèi)存翔烁,而且升級(jí)方便。
我們創(chuàng)建framework庫(kù)文件時(shí)旨涝,系統(tǒng)默認(rèn)是動(dòng)態(tài)庫(kù)的格式蹬屹,如果想做成靜態(tài)庫(kù),需要在buildSetting中將Mach-O Type選項(xiàng)設(shè)置為Static Library就行了颊糜!
framework VS .a
a:.a是純二進(jìn)制文件,不能直接拿來(lái)使用秃踩,需要配合頭文件衬鱼、資源文件一起使用。代碼資源憔杨、圖片鸟赫、json資源、xib文件等是無(wú)法打包進(jìn)去的消别,所以使用.a靜態(tài)庫(kù)的時(shí)候需要三個(gè)組成部分:.a文件+開放的頭文件+資源文件抛蚤。
framework:相當(dāng)于一個(gè)文件夾,可以直接拿來(lái)使用寻狂,所需要的資源岁经、頭文件、源文件都在里面蛇券。
Static Library/Framework VS Embedded Framework
Embedded
Framework是iOS8引入的為了方便Extention和宿主APP公用一份代碼庫(kù)而引入的缀壤,Embedded
Framework必須是Dynamic
framework(在buildSeting中設(shè)置為Dynamic)樊拓。如果你想限制在Extention中不可用的API放入你的Embedded
Framework,你可以勾選Allow app extension API only選框塘慕。
-framework的妙用
有些靜態(tài)庫(kù)文件我們只是在DEBUG模式下筋夏,調(diào)試使用。而不想打入release包中图呢,因?yàn)檫@樣會(huì)增加安裝包的大小条篷,這時(shí)可以在buildSetting中的Other
Linker Flags下對(duì)應(yīng)的模式中添加需要的庫(kù)文件,以-framework標(biāo)記蛤织,這樣程序編譯的時(shí)候就會(huì)根據(jù)里面的標(biāo)記來(lái)編譯進(jìn)執(zhí)行文件中赴叹。
在使用時(shí)可以利用runtime的反射來(lái)判斷庫(kù)文件有沒有被加載,或者利用buildSetting中的預(yù)編譯宏P(guān)reprocessor Macros來(lái)標(biāo)記瞳筏。