iOS 動態庫和靜態庫的區別 .a&framework

庫的本質是可執行的二進制文件,是資源文件和代碼編譯的一個集合。根據鏈接方式不同,可以分爲動態庫和靜態庫,其中系統提供的庫都屬於動態庫。

靜態庫:鏈接時會被完整的複製到可執行文件中,被多次使用就有多分拷貝。

  • 靜態庫形式: .a和.framework

       1.靜態庫在編譯時加載,鏈接時會完整的複製到可執行文件中。

       2.靜態庫的可執行文件通常會比較大,因爲所需的數據都會被整合到目標代碼中,因此編譯後的執行文件不需要外部庫的支持,直接就能使用。

       3.有多個app使用就會被複制多份,不能共享且佔用更多冗餘內存。

       4.所有的函數都在庫中,因此當修改函數時需要重新編譯。

  • .a 和 .framework 的區別

      1.  .a 是單純的二進制文件,.framework是二進制文件+資源文件。.a 不能直接使用,需要 .h文件配合,而.framework則可以直接使用。
     2.  .framework = .a + .h + sorrceFile(資源文件)

  •  推薦生成使用.framework。

 

動態庫連接時不復制,程序運行時由系統動態加載到內存,系統只加載一次。

  • 動態庫形式:.dylib和.framework

1.動態庫在程序運行時由系統動態加載到內存,供程序調用,如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行。
2.動態庫的文件會比較小,因爲在編譯過程中,數據並沒有整合到目標代碼中,只有在執行到該函數時纔去調用庫中的函數,所以首次加載時比較耗時。
3.多個程序可以共享內存中同一份庫資源,系統只加載一次,多個程序可共用,節省內存空間。
4.庫是動態的,因此修改庫中函數時,不需要重新編譯。

iOS8之前蘋果是不允許第三方框架使用動態庫方式實現的,但是iOS8之後添加了App Extesion,Extesion 需要與主App共享代碼,而且新加入的Swift的語言機制也需要動態庫,於是蘋果提出了Embedded Framework概念,這種動態庫允許App和App Extension共享代碼,但是這份動態庫的生命被限定在一個App進程內。簡單點可以理解爲被閹割的動態庫。
與系統的動態Framework 不同,使用 Cocoa Touch Framework 製作的動態庫 在打包和提交 App 時資源文件會被放到 App main bundle 的根目錄文件下,運行在沙盒裏,而不是系統中。所以,不同的 App 即使使用了同樣的 Framework,仍然需要被分別簽名,打包和加載。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章