前言
在iOS開發(fā)過程成,肯定會接觸到庫這個東西,比如系統(tǒng)的UIKit,第三方的SDWebImage等。所以庫其實就是代碼和文件的集合,通過這些可實現(xiàn)一些需要的功能。將這種代碼快打包成二進制文件。并且可以載入到內(nèi)存中。說白了就是將功能打包成一個模塊,方便在開發(fā)過程中使用和共享。
靜態(tài)庫和動態(tài)庫的區(qū)別
庫的本質(zhì)是可執(zhí)行的二進制文件,根據(jù)使用的方式不同,可以分為動態(tài)庫和靜態(tài)庫,其中系統(tǒng)提供的庫都屬于動態(tài)庫。
靜態(tài)庫
- 是以.a 或者. FrameWork的后綴形式存在。
- 靜態(tài)庫的可執(zhí)行文件通常會比較大,因為所需的數(shù)據(jù)都會被整合到目標代碼中,因此編譯后的執(zhí)行文件不需要外部庫的支持,直接就能使用。
- 靜態(tài)庫只需編譯時加載,鏈接時,會完整的復制份到可執(zhí)行文件中。
- 有多個app使用就會被復制多份,不能共享且占用更多冗余內(nèi)存。
- 所有的函數(shù)都在庫中,因此當修改函數(shù)時需要重新編譯。
動態(tài)庫
- 是以.tbd 或者. FrameWork的后綴形式存在。
- 動態(tài)庫的文件會比較小,因為在編譯過程中,數(shù)據(jù)并沒有整合到目標代碼中,只有在執(zhí)行到該函數(shù)時才去調(diào)用庫中的函數(shù),但以此首次加載就比較耗時。
- 動態(tài)庫由于沒有整合到目標代碼,因此編譯時不會加載,運行時動態(tài)申請調(diào)用。
- 多個app使用,可以共享資源減少內(nèi)存使用,但以此程序的運行環(huán)境需要提供相應的庫。
- 庫是動態(tài)的,因此修改庫中函數(shù)時,不需要重新編譯。
.FrameWork文件和其他兩者的區(qū)別在于,項目中庫的使用除了需要庫文件之外,還包含資源文件和頭文件。因此FrameWork其實已經(jīng)和庫文件沒有關系,只是將庫文件和所需的其他東西打包整合。
iOS8 之前,蘋果不允許第三方框架使用動態(tài)方式加載,從 iOS8 開始允許開發(fā)者有條件地創(chuàng)建和使用動態(tài)框架 Cocoa Touch Framework。和系統(tǒng) framework 不同,app 中使用 Cocoa Touch Framework 制作的動態(tài)庫 在打包和提交 app 時會被放到 app main bundle 的根目錄 中,運行在沙盒里,而不是系統(tǒng)中。也就是說,不同的 app 就算使用了同樣的 framework,但還是會有多份的框架被分別簽名,打包和加載。