Dynamic Library v.s. Static Library in Swift

Journey on programming
3 min readJul 6, 2018

--

Reference

https://www.ca.com/en/blog-developers/dynamic-versus-static-framework-in-ios.html
https://www.cnblogs.com/Jenaral/p/5530383.html
https://www.jianshu.com/p/3d0ae289dee0
https://blog.csdn.net/shifang07/article/details/76240287

Library v.s Framework

Library 裡面只能包含編譯完成的 .a 檔,而 Framework 則比較像是一群資源打包之後的結果,裡面會包含原始碼、header、圖片、nib、說明文檔等等…例如 Foundation.framework 或 UIKit.framework 都是 Cocoa Touch 框架所提供的 framework.

Static Library

Windows 上的 .lib, Linux/Mac 上的 .a

  • 會連同主專案一起被編譯成 binary 檔
  • 會使 binary 檔的體積變大
  • 重複的程式碼可以被優化,不會有重複的 code 出現
  • 影響 launch time 與 memory footprint
  • framework 沒有外部相依,可以直接運行
  • 沒有自己的 namespace 所以同名的檔案會有衝突

Dynamic Library

Windows 上的 .dll, Linux 上的 .so, Mac 上的 .tbd/.dylib

  • 不會被複製到程序中,僅會建立連結到該 Dynamic Library,直到使用該 framework 的時候才會被載入
  • 不影響編譯完的 binary 檔體積,但是因為需要把 framework 也一併包入 .app 當中,所以有可能導致整個 app 體積增加
  • 同一個 Library 可以同時被多個程序所引用,所以也稱為共享庫
  • 可直接對所引用的 Dynamic Library 直接去做替換,而不需要重新編譯
  • Dynamic Library 仰賴外部環境,如果環境不正確或版本不對,就會出現找不到 framework 的錯誤,找不到的時候,就會 crash
  • 有自己的 namespace ,所以即使檔案同名也沒有關係

Objective-C v.s. Swift

Objective-C 是動態語言,在運行的時候,如果要執行某方法,是透過 dispatch 的方式來做派送,也就是因為這樣的做法,才會衍生 method swizzling 這個方法,在運行的時候將 api 做交換。

Xcode 9 之後的版本才開始支援 Swift Static Library,但是 Swift + Cocoapods 還沒辦法順利相容,直到 Cocoapods 1.4 之後,才支援在 use_framework! 底下使用 Static Library. Cocoapods 1.5 之後才可以真正在 Swift 底下使用 Static Library.

官方建議使用的 dynamic library 上限是 6 個

怎麼取捨?

如果今天該 framework 會有自己的檔案(圖片或是其他等等),然後這些東西與主專案的關聯不大,這時候建議就可以透過 Dynamic Library 的方式來做使用,因為 Dynamic Library 會有自己的 bundle ,在控管上可以比較有效率。相對的,如果今天所使用的套件當中,有些東西可以跟主專案進行共用,這時候我就會建議透過 Static framework 來進行。

--

--

Journey on programming

Software Developer at 91APP. If you like my articles, please clap and follow me on Medium. Never stay still, never plateau!