庫是程序代碼的集合,是共享程序代碼的一種方式
1.
一種情況是某些代碼需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進(jìn)行封裝,只暴露出頭文件。
另外一種情況是,對(duì)于某些不會(huì)進(jìn)行大的改動(dòng)的代碼,我們想減少編譯的時(shí)間,就可以把它打包成庫,因?yàn)閹焓且呀?jīng)編譯好的二進(jìn)制了,編譯的時(shí)候只需要Link一下,不會(huì)浪費(fèi)編譯時(shí)間。
2.靜態(tài)庫:
靜態(tài)庫即靜態(tài)鏈接庫。鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝,且這段代碼在目標(biāo)程序里不會(huì)再改變。
優(yōu)點(diǎn)
編譯完成之后,庫文件實(shí)際上就沒有作用了。目標(biāo)程序沒有外部依賴,直接就可以運(yùn)行。
缺點(diǎn)
會(huì)使用目標(biāo)程序的體積增大。
動(dòng)態(tài)庫:
動(dòng)態(tài)庫即動(dòng)態(tài)鏈接庫。與靜態(tài)庫相反,動(dòng)態(tài)庫在鏈接時(shí)不復(fù)制(目標(biāo)程序中只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫的引用),程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,系統(tǒng)只加載一次,多個(gè)程序共用(如系統(tǒng)的UIKit.framework等),節(jié)省內(nèi)存。
優(yōu)點(diǎn)
不需要拷貝到目標(biāo)程序中,不會(huì)影響目標(biāo)程序的體積,而且同一份庫可以被多個(gè)程序使用(因?yàn)檫@個(gè)原因,動(dòng)態(tài)庫也被稱作共享庫)。
運(yùn)行時(shí)才載入的特性,也可以讓我們隨時(shí)對(duì)庫進(jìn)行替換,而不需要重新編譯代碼。
缺點(diǎn)
動(dòng)態(tài)載入會(huì)帶來一部分性能損失,使用動(dòng)態(tài)庫也會(huì)使得程序依賴于外部環(huán)境。如果環(huán)境缺少動(dòng)態(tài)庫或者庫的版本不正確,就會(huì)導(dǎo)致程序無法運(yùn)行(Linux 下喜聞樂見的 lib not found 錯(cuò)誤)。
.a和.framework的區(qū)別:
.a是純二進(jìn)制文件,.a文件不能單獨(dú)使用,至少要有.h文件配合
.framework除了二進(jìn)制文件外,還包含一些資源文件(頭文件,plist等),由于自身包含了頭文件,所以.framework可以單獨(dú)使用。