什么是庫 ?
庫就是程序代碼的集合,將N個文件組織起來,是共享程序代碼的一種方式。庫從本質上來說是一種可執(zhí)行代碼的二進制格式,可以被載入內存中執(zhí)行。
iOS開發(fā)中靜態(tài)庫和動態(tài)庫區(qū)別:
靜態(tài)庫和動態(tài)庫是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標代碼中,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在。
靜態(tài)庫 好處:
模塊化,分工合作,提高了代碼的復用及核心技術的保密程度
避免少量改動經常導致大量的重復編譯連接
也可以重用,注意不是共享使用
動態(tài)庫 好處:
使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小,將整個應用程序分模塊,團隊合作,進行分工,影響比較小
使用動態(tài)庫,多個應用程序共享內存中得同一份庫文件,節(jié)省資源
使用動態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達到更新應用程序的目的。
應用插件化
軟件版本實時模塊升級
在其它大部分平臺上,動態(tài)庫都可以用于不同應用間共享, 共享可執(zhí)行文件,這就大大節(jié)省了內存。
iOS平臺 在 iOS8 之前,蘋果不允許第三方框架使用動態(tài)方式加載,從 iOS8 開始允許開發(fā)者有條件地創(chuàng)建和使用動態(tài)框架,這種框架叫做 Cocoa Touch Framework。雖然同樣是動態(tài)框架,但是和系統(tǒng) framework 不同,app 中使用 Cocoa Touch Framework 制作的動態(tài)庫 在打包和提交 app 時會被放到 app main bundle 的根目錄 中,運行在沙盒里,而不是系統(tǒng)中。也就是說,不同的 app 就算使用了同樣的 framework,但還是會有多份的框架被分別簽名,打包和加載。不過 iOS8 上開放了 App Extension 功能,可以為一個應用創(chuàng)建插件,這樣主app和插件之間共享動態(tài)庫還是可行的。
蘋果系統(tǒng)專屬的framework 是共享的(如UIKit), 但是我們自己使用 Cocoa Touch Framework 制作的動態(tài)庫是放到 app bundle 中,運行在沙盒中的?
靜態(tài)庫和動態(tài)庫的存在的形式
靜態(tài)庫:以.a 和 .framework為文件后綴名。
動態(tài)庫:以.tbd(之前叫.dylib) 和 .framework 為文件后綴名。(系統(tǒng)直接提供給我們的framework都是動態(tài)庫!)
理解:.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件。 .a ,要有 .h 文件以及資源文件配合, .framework 文件可以直接使用。總的來說,.a + .h + sourceFile = .framework。所以創(chuàng)建靜態(tài)庫最好還是用.framework的形式
靜態(tài)庫和動態(tài)庫的區(qū)別
不同點:
靜態(tài)庫在鏈接時,會被完整的復制到可執(zhí)行文件中,如果多個App都使用了同一個靜態(tài)庫,那么每個App都會拷貝一份,缺點是浪費內存。類似于定義一個基本變量,使用該基本變量是是新復制了一份數據,而不是原來定義的;
動態(tài)庫不會復制,只有一份,程序運行時動態(tài)加載到內存中,系統(tǒng)只會加載一次,多個程序共用一份,節(jié)約了內存。類似于使用變量的內存地址一樣,使用的是同一個變量;
共同點:
靜態(tài)庫和動態(tài)庫都是閉源庫,只能拿來滿足某個功能的使用,不會暴露內部具體的代碼信息