iOS元件化常用的幾種構建模式
我們在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.模擬器和真機問題
參考連結:
7. 給 Pod 新增資原始檔
相關文章
- 淺談iOS常用的幾種傳值方式iOS
- 幾種常用設計模式的簡單示例設計模式
- vue3 常用的幾種元件通訊方式Vue元件
- ERP原理 | 業財一體化的幾種架構模式架構模式
- iOS 開發中 runtime 常用的幾種方法iOS
- iOS 資料持久化的幾種方法iOS持久化
- 常用的幾種大資料架構剖析大資料架構
- 優化 Webpack 構建效能的幾點建議優化Web
- 優化Webpack構建效能的幾點建議優化Web
- iOS應用資料儲存的幾種常用方式iOS
- ESB的幾種模式模式
- iOS開發——資料持久化的幾種方案iOS持久化
- 建立物件的幾種模式物件模式
- Iterator模式的幾種用法模式
- Markdown常用的幾種語法
- 常用的jQuery事件有幾種?jQuery事件
- 幾種常用的排序程式碼排序
- 幾種常用BroadcastReceiverAST
- iOS有關架構元件化的文章連結iOS架構元件化
- iOS 元件化/模組化架構設計實踐iOS元件化架構
- 很全!淺談幾種常用負載均衡架構負載架構
- iOS 幾種加密方法iOS加密
- IOS幾個常用類庫的用法iOS
- 優化 iOS 專案的構建時間(二)優化iOS
- iframe跨域的幾種常用方法跨域
- 幾種常用的排序演算法排序演算法
- 負載均衡的幾種常用方案負載
- iOS的元件化(模組化)之路iOS元件化
- Linux常用幾種shellLinux
- 構建微服務的三種重要模式 - DZone微服務微服務模式
- Salesforce構建可觀察微服務的五種設計模式Salesforce微服務設計模式
- Nagios 快速實現資料視覺化的幾種方式iOS視覺化
- iOS常見的幾種加密方法iOS加密
- iOS開發中的幾種鎖iOS
- iOS的元件化思路分享iOS元件化
- iOS的元件化開發iOS元件化
- 常見的幾種設計模式設計模式
- 構建自己的React UI元件庫: 構建首頁ReactUI元件