先補充一下靜態庫和動態庫的知識。這部份內容我也不太熟,沒有開發經驗,若有錯誤歡迎打臉。html
靜態庫的代碼追加到可執行文件內,被屢次使⽤用就有多份冗餘拷⻉。ios
好處就是應用程序包自身能夠獨立運行,而很差的地方就是包會略顯臃腫,庫不能共享。git
iOS 中靜態庫的形式是 .a 和 .framework (本身建立的 .framework 是靜態庫)。github
.a 文件在真正使用的時候須要提供頭文件和資源文件。之前 Xcode 中默認提供的就是這種方式。不過編譯出來靜態庫只支持特定的一種硬件架構體系,若是你想生成一個 Universal 的靜態庫的話,須要經過工具來將多個靜態庫進行合併。並且使用的時候須要另外配合 .h 文件,相比之下 framework 會是更好的選擇。objective-c
framework 不但能夠包含二進制文件,還能夠包含頭文件,資源文件等,甚至能夠支持多個版本。不過各個應用所使用的本身的公用庫,最終都須要 link 進可執行文件,因此本質上仍是一個靜態庫。swift
動態庫的代碼和可執行文件是分開獨立的,程序運行時由系統動態加載到內存,系統只加載一次,多個程序共用節省內存。xcode
動態庫的優劣與靜態庫相反,動態連接庫須要庫環境,但因爲自己不集成庫內容,會比較小,同時也爲和其餘應用共享庫的使用提供了可能。安全
iOS 中動態庫的形式是 .dylib 和 .framework (系統的 .framework 是動態庫)。架構
出於安全層面的考慮, AppStore 不容許使用第三方的動態連接庫。咱們能夠經過 framework 編寫本身的公用庫。隨着 Xcode6 開始支持新建 framework ,不再用手動配置了。iOS-Universal-Framework 也宣佈中止更新。app
模塊化 (modules) 是在 2012年的 LLVM Developers Meeting 中提出的。簡單說就是用樹形的結構化描述來取代以往的平坦式 #include
,對框架進行封裝,從而解決以往方法的脆弱性和擴展性不足的問題。 (這段我也不太懂,只是翻譯了一下。。。)
以 UIKit 爲例, module.map
大概是這個樣子:
framework module UIKit { umbrella header "UIKit.h" module * {export *} link framework "UIKit" }
使用的時候用 @import
便可。若是全部代碼都須要這樣重寫一定是一項浩大的工程,因此 Apple 已經提早把這部分工做作好了。只要使用的是 iOS7 的 SDK,將 Enable Modules 打開後,而後保持原來的 #import
寫法就好了,編譯器會在編譯的時候自動地把可能的地方換成 modules 的寫法去編譯。
寫到這裏,我忽然忘了我原本想些什麼的了。。。走了太遠,忘了當初爲何出發了擦。
那就這樣吧。