首先我們要知道 什么是 類 庫摹芙?
庫是程序代碼的集合陕壹,是共享程序代碼的一種方式
而我們根據(jù)源代碼的公開情況奸鸯,庫可以分為2種類型 開源庫 和 閉源庫
開源庫
公開源代碼免绿,能看到具體實(shí)現(xiàn) ,比如SDWebImage、AFNetworking閉源庫
不公開源代碼零渐,是經(jīng)過編譯后的二進(jìn)制文件窒舟,看不到具體實(shí)現(xiàn) 而閉源庫 主要分為:靜態(tài)庫、動(dòng)態(tài)庫靜態(tài)庫和動(dòng)態(tài)庫的存在形式
靜態(tài)庫:.a 和 .framework
動(dòng)態(tài)庫:.dylib 和 .framework (iOS9 取消了.dylib, 使用.tbd替代)
所以我們說: .a 一定是靜態(tài)庫. .dylib一定是動(dòng)態(tài)庫, framework 可能是靜態(tài)庫,也可能是動(dòng)態(tài)庫靜態(tài)庫和動(dòng)態(tài)庫在使用上的區(qū)別?
靜態(tài)庫:鏈接時(shí)诵盼,靜態(tài)庫會(huì)被完整地復(fù)制到可執(zhí)行文件中惠豺,被多次使用就有多份冗余拷貝
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存风宁,供程序調(diào)用洁墙,系統(tǒng)只加載一次,多個(gè)程序共用戒财,節(jié)省內(nèi)存
-
靜態(tài)庫 一個(gè)系統(tǒng)上,程序1 使用某個(gè)靜態(tài)庫,程序2也使用這個(gè)靜態(tài)庫,那么 可能系統(tǒng)上存在多份 一樣的靜態(tài)庫.
靜態(tài)庫.png 動(dòng)態(tài)庫,在運(yùn)行的時(shí)候,動(dòng)態(tài)決定使用哪個(gè)庫,這樣程序1,使用某個(gè)動(dòng)態(tài)庫,程序2也使用這個(gè)動(dòng)態(tài)庫,哪個(gè)程序用這個(gè)靜態(tài)庫,就引用一下.這樣手機(jī)上只存在一份動(dòng)態(tài)庫.
既然動(dòng)態(tài)庫這么好,那么我們都使用動(dòng)態(tài)庫,不是很好嘛?但是你錯(cuò)了.
值得注意的是:
項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫热监,不能被上傳到AppStore
- 靜態(tài)庫使用場景:
1> 核心代碼,有共性的一些代碼.我們編寫成靜態(tài)庫
2>在MRC下寫的代碼.寫成.a或者是.framework.被編譯成二進(jìn)制文件,這樣在ARC 和 MRC下都能用 - 動(dòng)態(tài)庫的使用場景:
1>系統(tǒng)的動(dòng)態(tài)庫.
2>別人引用的第三方動(dòng)態(tài)庫,它很麻煩,需要在embedded Binaries (嵌入的二進(jìn)制)->添加對應(yīng)的.framework.而且,別人的項(xiàng)目在上架的時(shí)候,有可能會(huì)被拒,因?yàn)樗褂昧说谌降膭?dòng)態(tài)庫,不是系統(tǒng)的