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
Journey on programming

Written by Journey on programming

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

No responses yet