庫是程序代碼的集合,是共享程序代碼的一種方式
1.
一種情況是某些代碼需要給別人使用诱渤,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,只暴露出頭文件励烦。
另外一種情況是,對于某些不會進行大的改動的代碼泼诱,我們想減少編譯的時間坛掠,就可以把它打包成庫,因為庫是已經(jīng)編譯好的二進制了治筒,編譯的時候只需要Link一下屉栓,不會浪費編譯時間。
2.靜態(tài)庫:
靜態(tài)庫即靜態(tài)鏈接庫耸袜。鏈接時會被完整的復(fù)制到可執(zhí)行文件中友多,被多次使用就有多份拷貝,且這段代碼在目標(biāo)程序里不會再改變堤框。
優(yōu)點
編譯完成之后域滥,庫文件實際上就沒有作用了。目標(biāo)程序沒有外部依賴蜈抓,直接就可以運行启绰。
缺點
會使用目標(biāo)程序的體積增大。
動態(tài)庫:
動態(tài)庫即動態(tài)鏈接庫沟使。與靜態(tài)庫相反委可,動態(tài)庫在鏈接時不復(fù)制(目標(biāo)程序中只會存儲指向動態(tài)庫的引用),程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存腊嗡,系統(tǒng)只加載一次着倾,多個程序共用(如系統(tǒng)的UIKit.framework等)拾酝,節(jié)省內(nèi)存。
優(yōu)點
不需要拷貝到目標(biāo)程序中屈呕,不會影響目標(biāo)程序的體積微宝,而且同一份庫可以被多個程序使用(因為這個原因,動態(tài)庫也被稱作共享庫)虎眨。
運行時才載入的特性蟋软,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼嗽桩。
缺點
動態(tài)載入會帶來一部分性能損失岳守,使用動態(tài)庫也會使得程序依賴于外部環(huán)境。如果環(huán)境缺少動態(tài)庫或者庫的版本不正確碌冶,就會導(dǎo)致程序無法運行(Linux 下喜聞樂見的 lib not found 錯誤)湿痢。
.a和.framework的區(qū)別:
.a是純二進制文件,.a文件不能單獨使用扑庞,至少要有.h文件配合
.framework除了二進制文件外譬重,還包含一些資源文件(頭文件,plist等)罐氨,由于自身包含了頭文件臀规,所以.framework可以單獨使用。