標籤:
一.靜態庫簡介1. 什麼是庫?
庫 就是程式碼的集合, 是共用程式碼的一種方式
2. 庫的分類?
開源庫
公開原始碼, 能看到具體實現
例如MJExtension, MJRefresh, AFNetworking...
閉源庫
不公開原始碼, 是經過編譯後的二進位檔案, 看不到具體實現
主要分為: 靜態庫 和 動態庫
3. 靜態庫的存在形式?
4. 動態庫的存在形式?
5. 靜態庫和動態庫的區別?
靜態庫在連結時, 會被完整的複製到可執行檔中; 被多次使用, 就有多份拷貝;
動態庫則不會複製, 只有一份. 程式運行時動態載入到記憶體; 系統只載入一次, 多個程式共用, 節省記憶體;
但是!!!! 項目中如果使用到自己的動態庫, 不允許上架!
- 再但是!!! WWDC2014上公布的 蘋果對ios8開放動態載入dylib的介面 也就是說 開放了動態庫掛載
6. 靜態庫應用情境?
7. 靜態庫的特點?
.a + .h
看不到具體實現的代碼
二.靜態庫的製作(.a)1.產生靜態庫大步驟
1. 建立項目時, 直接選擇靜態庫(.a)2. 設定需要暴漏的標頭檔 TARGETS -> Build Phases -> Copy Files 把需要暴漏的標頭檔添加進來即可3. 在模擬器環境下編譯(得到模擬器環境下的靜態庫) 選擇模擬器6S,編譯4. 在真機環境下編譯(得到真機環境下的靜態庫)
2.靜態庫使用測試
1.使用模擬器的靜態庫, 拖入測試工程 使用6S模擬器進行測試, 通過 使用真機, 編譯; 失敗 使用低型號模擬器測試,; 失敗2.測試結果分析 模擬器下的靜態庫和真機下的靜態庫不能共用 主要原因是模擬器和真機CPU架構不一樣(各個模擬器型號之間架構也不一樣)3.注意靜態庫所支援的架構 不同機型的CPU, 對應的架構不同; 模擬器: 4s----5 : i386 5s----6sPlus : x86_64 真機: 3gs---4s : armv7 5/5c : armv7s(armv7相容armv7s) 5s---6sPlus: arm644.查看靜態庫支援的架構 lipo -info 庫檔案 分別選中不同的模擬器, 進行編譯, 查看不同的靜態庫支援架構5.怎樣一次編譯支援多個架構的的靜態庫? 問題描述: 正常情況下, 需要選中每一個模擬器進行編譯, 產生支援對應架構的靜態庫. 然後合并; 非常蛋疼 解決方案: Build Settings -> Build Active -> NO 表示不止編譯活躍的架構, 讓所有的架構都編譯
3.靜態庫檔案的版本
1.調試版本 1.真機-Debug版本 2.模擬器-Debug版本 特點 - 調試版本會包含完整的符號資訊,以方便調試 - 調試版本不會對代碼進行最佳化2.發布版本 1.真機-Release版本 2.模擬器-Release版本 特點 - 發布版本不會包含完整的符號資訊 - 發布版本的執行代碼是進行過最佳化的 - 發布版本的大小會比調試版本的略小 - 在執行速度方面,發布版本會更快些,但不意味著會有顯著的提升3.怎樣產生不同版本? 項目 -> Edit Scheme -> Run -> Release/Debug 分別進行編譯4.如果想要一個靜態庫, 既可以在模擬器上運行, 也可以在真機上運行怎麼做? 因為靜態庫針對於模擬器和真機產生了不同版本(支援不同架構), 所以沒法同時運行 解決方案: 靜態庫的合并 檢測.a的類型 $ lipo -info libCZTools.a 合并.a lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a 特點 # 合并.a的好處,開發過程中既可以在真機上調試,也可以在模擬器上調試 # 合并.a的壞處,如果靜態庫太大,合并打包後,會非常大,因此很多第三方的靜態庫的.a是區分版本的 # 今後在使用.a時一定注意版本
三.靜態庫製作(.framework)
- 建立功能, 直接選擇.framework靜態庫
編譯時間, 設定編譯所有架構
預設製作的是動態庫, 需要設定連結類型
target -> Build Settings-> 搜尋 Mach-o Type ; 改為靜態庫
四.總結1. 靜態庫打包的完整正確步驟!!
1. 確定是靜態庫 .a 的肯定是靜態庫 .framework的需要設定連結類型 target -> Build Settings-> 搜尋 Mach-o Type ; 改為靜態庫
2. 確定支援模擬器或者真機中的所有架構 Build Settings -> Build Active -> NO 表示不止編譯活躍的架構, 讓所有的架構都編譯3. 提供的靜態庫應該是release版本 項目 -> Edit Scheme -> Run -> Release/Debug 分別進行編譯
2. .a靜態庫和.framework靜態庫的區別?
1> .a是一個純二進位檔案, .framework中除了有二進位檔案之外還有資源檔2> .a檔案不能直接使用, 至少要有.h檔案的配合; .framework檔案可以直接使用3> .a + .h + sourceFile = .framework4> 建議使用.framework
3. 靜態庫開發中的常見問題
問題1: 有些第三方庫會使用到一些圖片素材,例如公司的logo等。 由於Xcode預設在編譯時間會把所有的素材檔案匯入到mainBundle中,可能與使用靜態庫的程式衝突。 解決方案: 在靜態庫中如果要使用圖片素材,會利用bundle的手段 1> 建立bundle,並且向其中添加圖片 2> 建立一個類方法,返回圖片 3> 編譯 4> 調用方如果需要使用,需要匯入 .h + .a + XXX.bundle問題2:如果使用者需要匯入的標頭檔過多怎麼加? 建議使用一個主標頭檔包含其他標頭檔, 讓使用者只匯入一個主標頭檔問題3: 靜態庫程式怎樣測試? 靜態庫本身就是一個小項目, 實現某些功能, 但是這些功能在開發中也需要測試. 而測試代碼又不能作為靜態庫的一部分 解決方案: 建立複合項目
4. 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換
5. 補充: swift動態庫打包以及使用
注意: swift不支援靜態庫
想要暴漏介面出去, 學會使用public關鍵字
6.靜態庫(.framework)合并
http://www.cnblogs.com/KeenLeung/p/5491332.html
iOS : 靜態庫