Framework打包前傳

關於庫的一些基礎知識swift

首先來了解一下什麼是庫:庫(Library)實際上是一段編譯好的二進制代碼,而後將頭文件暴露出來(OC中就是.h文件,swift中打包後Xcode將會自動生成.h文件 須要將Swift代碼前面添加public)提供給別人使用性能

關於爲何使用庫!1.只提供給使用者接口而不暴露出來具體的實現方式spa

                           2.不會對代碼進行較大的頻繁的改動,減小編譯時間(由於庫就是一段已經編譯好的二進制代碼使用時候只須要Link一下就能夠了)code

關於Link 就衍生出來了 靜態連接以及動態連接,也就是動態庫以及靜態庫接口

1.靜態庫資源

靜態庫即靜態連接庫(Windows 下的 .lib,Linux 和 Mac 下的 .a)開發

使用時直接copy一份在項目中,在目標程序中就不會改變了。it

好處:沒有外部依賴,直接運行io

缺點:使目標項目體積增大編譯

2.動態庫

動態庫即動態連接庫(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)

與靜態庫相反,動態庫編譯時候不會copy到程序中,只會存儲動態庫的引用。等程序運行時纔會加入動態庫

編譯才載入的特性,也可讓咱們隨時對庫進行替換,而不須要從新編譯代碼

優勢:不會增大目標程序體積,同一份庫能夠被多個程序使用

缺點:一部分性能損失。依賴於外部環境。若是環境缺失或者庫版本不對。將會致使程序沒法運行

 

iOS:Framework

Framework其實是一種打包方式,將庫的二進制文件,頭文件和相關資源打包到一塊兒,方便管理髮布。

iOS8之前不支持動態Framework。開發者只可使用蘋果自家的UIKit.Framework,Foundation.Framework等。因爲iOS的應用都運行在沙盒中,不一樣程序之間沒法共享代碼,同時動態下載代碼蘋果明令禁止,無法發揮出來動態庫的優點,因此動態庫沒有存在的必要。因此只能打包成爲靜態庫.a文件同時附上頭文件

iOS8/Xcode 6 推出以後。iOS平臺添加了動態庫支持,同時Xcode也原聲自帶了Framework支持(動靜太均可以Static以及Dynamic)關於爲何添加動態庫支持。可能的理由是Swift的Extension出現吧

Extension和APP是兩個分開的可執行文件。須要共享代碼。可是和系統的Framework仍是有較大區別的。首先須要copy到目標程序中,App和Extension的Bundle是共享的,所以成爲Embedded Framework

 

Swift支持

跟着iOS8/Xcode 6 同時發佈的還有Swift。若是在項目中使用外部的代碼。可選的方式1:直接將代碼copy到過程當中,另一種就是動態的Framework,使用靜態庫是不支持的。(這也是我後來將Swift代碼改爲OC代碼打包成靜態Framework的主要緣由吧 😭😭😭)

形成這個問題的緣由主要是 Swift 的 Runtime 沒有被包含在 iOS 系統中,而是會打包進 App 中(這也是形成 Swift App 體積大的緣由),靜態庫會致使最終的目標程序中包含重複的 Runtime(這是蘋果自家的解釋)。同時拷貝 Runtime 這種作法也會致使在純 ObjC 的項目中使用 Swift 庫出現問題。蘋果聲稱等到 Swift 的 Runtime 穩定以後會被加入到系統當中,到時候這個限制就會被去除了。

相關文章
相關標籤/搜索