iOS元件化常用的幾種構建模式

weixin_34279579發表於2016-06-01

我們在iOS開發中,當專案比較大的時候,需要把很多功能拆分出來,進行元件化,模組化處理,便於開發,維護。

我們經常使用的方法有以下幾種:

1.生成靜態庫(.a/.framework)

2.生成動態庫(.framework)

3.主專案-子專案構建

4.Cocoa Pods 依賴包方式(推薦)

基礎知識:

1. 庫:

庫從本質上來說是一種可執行程式碼的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。

iOS中的靜態庫有 .a 和 .framework兩種形式;動態庫有.dylib 和 .framework 形式,後來.dylib動態庫又被蘋果替換成.tbd的形式。

2.靜態庫與動態庫的區別

1>靜態函式庫

這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯。

2>動態函式庫

這類庫的名字一般是libxxx.so;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目的碼中,你的程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的升級比較方便。

靜態庫和動態庫是相對編譯期和執行期的:靜態庫在程式編譯時會被連結到目的碼中,程式執行時將不再需要改靜態庫;而動態庫在程式編譯時並不會被連結到目的碼中,只是在程式執行時才被載入,因為在程式執行期間還需要動態庫的存在。

總結:同一個靜態庫在不同程式中使用時,每一個程式中都得匯入一次,打包時也被打包進去,形成一個程式。而動態庫在不同程式中,打包時並沒有被打包進去,只在程式執行使用時,才連結載入(如系統的框架如UIKit、Foundation等),所以程式體積會小很多,但是蘋果不讓使用自己的動態庫,否則稽核就無法通過。

3.使用庫的優勢

使用靜態庫的好處

1,模組化,分工合作

2,避免少量改動經常導致大量的重複編譯連線

3,也可以重用,注意不是共享使用

動態庫使用有如下好處:

1使用動態庫,可以將最終可執行檔案體積縮小

2使用動態庫,多個應用程式共享記憶體中得同一份庫檔案,節省資源

3使用動態庫,可以不重新編譯連線可執行程式的前提下,更新動態庫檔案達到更新應用程式的目的。

4. Apple對於連結庫的支援

1>iPhone對於連結庫的支援

iPhone官方只支援靜態庫聯編,不支援動態連結庫。而對於靜態庫有兩種方式:一種是生成.a檔案;一種是生成靜態framework。所謂的靜態framework,實際上也是一種靜態庫,其相對於.a檔案來說,區別在於其不僅包含了庫檔案,還包含了標頭檔案和資原始檔。而在使用.a檔案時,還要另外新增.h檔案。

iPhone不支援動態連結庫的原因可能有:

①共享給誰?(因為在現在的iPhone,iPodTouch,iPad上面程式都是單程式的,也就是某一時刻只有一個程式在執行,你使用的時候只有你一個應用程式存在,其他的應該被掛起了,即便是可以同時多個程式執行,別人能使用你的共享庫裡的東西嗎?你這個是給你自己的程式定製的。)

②目前蘋果的AppStore不支援模組更新,無法更新某個單獨檔案(除非自己寫一個更新機制:有自己的服務端放置最新動態庫檔案),也就是說,就算你通過其他方式產生了動態連結庫,也無法達到更新動態庫檔案從而更新應用程式的目的。

2>Xcode對於建立庫的支援

Xcode不支援自己建立動態連結庫。而framework也分為靜態框架和動態框架,大部分框架都是動態連結庫的形式。因為只有蘋果才能在iOS裝置上安裝動態庫,所以我們也無法建立動態框架。

而且蘋果也從Xcode中移除了建立靜態iOS框架的功能!!!

通常來說,Xcode只支援建立靜態庫檔案.a。但是實際上Appstore是允許程式碼封裝在靜態連結庫中的。所以,出現了所謂的”偽框架”和”真框架”。

3>iOS8上開放了App Extension功能,可以為一個應用建立外掛,這樣主app和外掛之間共享動態庫還是可行的。

framework是Cocoa/Cocoa Touch程式中使用的一種資源打包方式,可以將將程式碼檔案、標頭檔案、資原始檔、說明文件等集中在一起,方便開發者使用,作為一名Cocoa/Cocoa Touch程式設計師每天都要跟各種各樣的Framework打交道。Cocoa/Cocoa Touch開發框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,這些framework無一例外都是動態庫。

但殘忍的是,Cocoa Touch上並不允許我們使用自己建立的framework。不過由於framework是一種優秀的資源打包方式,擁有無窮智慧的程式設計師們便想出了以framework的形式打包靜態庫的招數,因此我們平時看到的第三方釋出的framework無一例外都是靜態庫,真正的動態庫是上不了AppStore的。

WWDC2014給我的一個很大感觸是蘋果對iOS的開放態度:允許使用動態庫、允許第三方鍵盤、App Extension等等,這些在之前是想都不敢想的事。

常見問題:

1.編譯錯誤

2.引用錯誤

3.缺少庫

4.Build Setting設定

5.版本相容

6.程式碼衝突

7.程式碼自身語法問題

8.資源庫需要VPN翻牆問題

9.圖片資源bundle問題

10.nib/xib/storyboard問題

11.製作庫(依賴),依賴第三方庫的問題(“依賴的依賴”)

12.模擬器和真機問題

參考連結:

1. iOS開發——建立你自己的Framework

2. iOS應用架構談 元件化方案

3. Xcode 建立.a和framework靜態庫

4. IOS中建立使用連結庫(總結)

5. iOS 打包靜態庫和動態庫

6. WWDC2014之iOS使用動態庫

7. 給 Pod 新增資原始檔

相關文章