靜態(tài)庫和動態(tài)庫 學習總結

一 庫的簡介

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 的更新。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容