iOS開發關於"架構"的那些事
來源:互聯網
上載者:User
靜態庫 (Static Library)
所謂靜態庫,或者說 .a 檔案,就是一系列從源碼編譯的目標檔案的集合。它是你的源碼的實現所對應的二進位。配合上公用的 .h 檔案,我們可以擷取到 .a 中暴露的方法或者成員等。在最後編譯 app 的時候.a 將被連結到最終的可執行檔中,之後每次都隨著app的可執行二進位檔案一同載入,你不能控制載入的方式和時機,所以稱為靜態庫。
在 iOS 8 之前,iOS 只支援以靜態庫的方式來使用第三方的代碼。
動態架構 (Dynamic Framework)
與靜態相對應的當然是動態。我們每天使用的 iOS 系統的架構是以 .framework 結尾的,它們就是動態架構。
Framework 其實是一個 bundle,或者說是一個特殊的檔案夾。系統的 framework 是存在於系統內部,而不會打包進 app 中。app 的啟動的時候會檢查所需要的動態架構是否已經載入。像 UIKit 之類的常用系統架構一般已經在記憶體中,就不需要再次載入,這可以保證 app 啟動速度。相比靜態庫,framework 是自包含的,你不需要關心標頭檔位置等,使用起來很方便。
Universal Framework
iOS 8 之前也有一些第三方庫提供 .framework 檔案,但是它們實質上都是靜態庫,只不過通過一些方法進行了封裝,相比傳統的 .a 要好用一些。像是原來的 Dropbox 和 Facebook 等都使用這種方法來提供 SDK。不過因為已經脫離時代,所以在此略過不說。有興趣和需要的朋友可以參看一下這裡和這裡。
Library && Framework
對比靜態庫和動態架構,後者是有不少優勢的。
首先,靜態庫不能包含像 xib 檔案,圖片這樣的資源檔,其他開發人員必須將它們複製到 app 的 main bundle 中才能使用,維護和更新非常困難;而 framework 則可以將資源檔包含在自己的 bundle 中。 其次,靜態庫必須打包到二進位檔案中,這在以前的 iOS 開發中不是很大的問題。但是隨著 iOS 擴充(比如通知中樞擴充或者 Action 擴充)開發的出現,你現在可能需要將同一個 .a 包含在 app 本體以及擴充的二進位檔案中,這是不必要的重複。
最後,靜態庫只能隨應用 binary 一起載入,而動態架構載入到記憶體後就不需要再次載入,二次啟動速度加快。另外,使用時也可以控制載入時機。
動態架構有非常多的優點,但是遺憾的是以前 Apple 不允許第三方架構使用動態方式,而只有系統架構可以通過動態方式載入。
Cocoa Touch Framework
Apple 從 iOS 8 開始允許開發人員有條件地建立和使用動態架構,這種架構叫做 Cocoa Touch Framework。
雖然同樣是動態架構,但是和系統 framework 不同,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 時會被放到 app bundle 中,運行在沙箱裡,而不是系統中。也就是說,不同的 app 就算使用了同樣的 framework,但還是會有多份的架構被分別簽名,打包和載入。
Cocoa Touch Framework 的推出主要是為瞭解決兩個問題:首先是應對剛才提到的從 iOS 8 開始的擴充開發。其次是因為 Swift,在 Swift 開源之前,它是不支援編譯為靜態庫的。雖然在開源後有編譯為靜態庫的可能性,但是因為 Binary Interface 未確定,現在也還無法實用。這些問題會在 Swift 3 中將被解決,但這至少要等到今年下半年了。
現在,Swift runtime 不在系統中,而是打包在各個 app 裡的。所以如果要使用 Swift 靜態架構,由於 ABI 不相容,所以我們將不得不在靜態包中再包含一次 runtime,可能導致同一個 app 包中包括多個版本的運行時,暫時是不可取的。
包和依賴管理
在使用架構的時候,用一些包管理和依賴管理工具可以簡化使用流程。其中現在使用最廣泛的應該是 [CocoaPods],使用:http://blog.csdn.net/feng2qing/article/details/49983423
摘自:中國首屆Swift開發人員大會中_王巍演講https://onevcat.com/#blog