一 庫的簡介
1 什么是庫
庫就是程序代碼的集合 是共享程序代碼的一種方式
2 庫的分類
- 2.1 開源庫
公開源代碼 能看到具體實現
例如AFN,MJRefresh,FMDB,SDWebImage... - 2.2閉源庫
不公開源代碼 是經過編譯后的二進制文件,看不到具體實現
主要分為: 靜態(tài)庫,動態(tài)庫
3 這兩種庫的存在形式
- 靜態(tài)庫
- .a 和 .framework
- 動態(tài)庫
- .dylib(.tbd) 和 .framework
注意 兩者都有framework的格式,但是當你創(chuàng)建一個framework文件時,系統(tǒng)默認是動態(tài)庫的格式,如果想做成靜態(tài)庫,需要在buildSetting中將Mach-O Type選項設置為Static Library就行了!
4 .a文件和.framework文件的區(qū)別
.a是一個純二進制文件,不能直接拿來使用,需要配合頭文件、資源文件一起使用。 將靜態(tài)庫打包的時候,只能打包代碼資源,圖片、本地json文件和xib等資源文件無法打包進去,使用.a靜態(tài)庫的時候需要三個組成部分:.a文件+需要暴露的頭文件+資源文件;
.framework中除了有二進制文件之外還有資源文件,可以拿來直接使用
5 靜態(tài)庫和動態(tài)庫的區(qū)別
靜態(tài)庫
靜態(tài)庫在鏈接時,會被完整的復制到可執(zhí)行文件中,被多次使用,就有多份拷貝。利用靜態(tài)函數庫編譯成的文件比較大,因為整個 函數庫的所有數據都會被整合進目標代碼中。動態(tài)庫
動態(tài)庫則不會 只有一份 程序運行時動態(tài)加載到內存中,系統(tǒng)只加載一次,多個程序公用 節(jié)省內存。由于函數庫沒有被整合進你的程序,而是程序運行時動態(tài)的申請并調用,所以程序的運行環(huán)境中必須提供相應的庫。動態(tài)函數庫的改變并不影響你的程序,所以動態(tài)函數庫的升級比較方便。注意 項目中如果使用到自己的動態(tài)庫 不允許上架。
靜態(tài)庫和動態(tài)庫都是閉源庫,只能拿來滿足某個功能的使用,不會暴露內部具體的代碼信息,而從github上下載的第三方庫大多是開源庫
靜態(tài)庫和動態(tài)庫都是由*.o目標文件生成
6 靜態(tài)庫的好處
- 6.1 模塊化 分工合作
- 6.2 將MRC的項目打包成靜態(tài)庫,可以在ARC下直接使用 不需要轉換
- 6.3 也可以重用,注意不是共享使用
7 動態(tài)庫的好處
- 可以將最終可執(zhí)行文件體積縮小
- 多個應用程序共享內存中得同一份庫文件,節(jié)省資源
- 可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達到更新應用程序的目的
- 其實動態(tài)庫應該叫共享庫,那么從這個意義上來說,蘋果禁止iOS開發(fā)中使用動態(tài)庫就可以理解了: 因為在現在的iPhone,iPodTouch,iPad上面程序都是單進程的,也就是某一時刻只有一個進程在運行,那么問題來了,那么你寫個共享庫
- 共享給誰?(你使用的時候只有你一個應用程序存在,其他的應該被掛起了,即便是可以同時多個進程運行,別人能使用你的共享庫里的東西嗎?你這個是給你自己的程序定制的。)
- 目前蘋果的AppStore不支持模塊更新,無法更新某個單獨文件(除非自己寫一個更新機制:有自己的服務端放置最新動態(tài)庫文件)
8 制作靜態(tài)庫需要注意的幾點
注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫,我們需要的都是二進制文件+.h+其它資源文件的形式,不同的是,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用,而.framework本身已經包含了.h和其它文件,可以直接使用。
圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。
category是我們實際開發(fā)項目中經常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linkerflags的值為-ObjC。
如果一個靜態(tài)庫很復雜,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。
9 framework動態(tài)庫的主要作用:
framework本來是蘋果專屬的內部提供的動態(tài)庫文件格式,但是自從2014年WWDC之后,開發(fā)者也可以自定義創(chuàng)建framework實現動態(tài)更新(繞過apple store審核,從服務器發(fā)布更新版本)的功能,這與蘋果限定的上架的app必須經過apple store的審核制度是沖突的,所以含有自定義的framework的app是無法在商店上架的,但是如果開發(fā)的是企業(yè)內部應用,就可以考慮嘗試使用動態(tài)更新技術來將多個獨立的app或者功能模塊集成在一個app上面!
- 目前 iOS 上的動態(tài)更新方案主要有以下 4 種:
- HTML 5
- lua(wax)hotpatch
- react native
- framework
前面三種都是通過在應用內搭建一個運行環(huán)境來實現動態(tài)更新(HTML 5 是原生支持),在用戶體驗、與系統(tǒng)交互上有一定的限制,對開發(fā)者的要求也更高(至少得熟悉 lua 或者 js)。
使用 framework 的方式來更新可以不依賴第三方庫,使用原生的 OC/Swift 來開發(fā),體驗更好,開發(fā)成本也更低。
由于 Apple 不希望開發(fā)者繞過 App Store 來更新 app,因此只有對于不需要上架的應用,才能以 framework 的方式實現 app 的更新。