標籤:
前言:此文是關於靜態庫的概念描述,如何製作及簡單調試使用,不同版本的說明與情境使用。
1.關於庫的簡介:
庫可以分為2種類型
- 開源庫
- 公開原始碼,能看到具體實現
- 比如SDWebImage、AFNetworking
- 閉源庫
- 不公開原始碼,是經過編譯後的二進位檔案,看不到具體實現
- 主要分為:靜態庫、動態庫
2.靜態庫的特點:.a+.h;
為什麼製作閉源庫
- 國內的企業,掌握有核心技術,同時是又希望更多的程式員來使用其技術,因此採用"閉源"的方式開發使用 例如:百度地圖,友盟,JPush等
- 在企業開發中,一些核心技術或者常用架構,出於安全性和穩定性的考慮,也會提供靜態庫給程式員使用
- 靜態庫與動態庫
- 靜態庫和動態庫的存在形式
- 靜態庫:.a 和 .framework
- 動態庫:.dylib(Xcode7.0之前) .tbd[Xcode7以後] 和 .framework
- 靜態庫和動態庫在使用上的區別
- 靜態庫:連結時,靜態庫會被完整地複製到可執行檔中,被多個應用使用就有多份冗餘拷貝(左圖所示)
- 動態庫:連結時不複製,程式運行時由系統動態載入到記憶體,供程式調用,系統只載入一次,多個程式共用,節省記憶體(所示)
3.(可忽略,因為目前比較少使用xcode6了)需要注意的是:項目中如果使用了自製的動態庫,在Xcode6之前不能被上傳到AppStore,Xcode6以後可以上傳AppStore。
3.靜態庫的簡單製作
1> 建立Tools項目
2> 建立一個類方法,實現一個簡單的加法
+ (double) sumNum1:(double) x andNum2:(double) y;
+ (double)sumNum1:(double)x andNum2:(double)y { return x + y; }
3> 編譯
# 注意,在編譯靜態庫時,需要編譯兩個版本 -> 真機(arm) | 模擬器(i386)
-
- 查看檔案導覽列->Product->libTools.a檔案,如果為
紅色表示沒有產生.a檔案,如果是黑色表示產生了.a檔案
- 僅僅編譯模擬器不會產生.a,需要在真機下編譯才能產生.a檔案
- 選中.a檔案->右擊->showFinder ,產生兩個.a檔案,一個用於真機,一個用於模擬器
4> 測試產生的靜態庫
建立ToolsTest的iOS項目
- 將編譯產生的模擬器的.a + .h拖到項目中使用
- 在ViewController.m匯入Tools.h檔案
- 使用調用類方法 + (double) sumNum1:(double) x andNum2:(double) y;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ double rs = [Tools sumNum1:10 andNum2:20]; NSLog(@"%lf",rs);}
輸出結果:30
4.靜態庫中的資源套件的使用
問題:有些第三方庫會使用到一些圖片素材,例如公司的logo等。但是由於Xcode預設在編譯時間會把所有的素材檔案匯入到mainBundle中,為了避免與使用靜態庫的程式衝突。在靜態庫中如果要使用圖片素材,會利用bundle的手段.
步驟:
1> 建立bundle,並且向其中添加圖片
2> 建立一個類方法,返回圖片
3> 編譯
4> 調用方如果需要使用,需要匯入 .h + .a + XXX.bundle
5.靜態庫的合并(因為在模擬器與真機的運行架構不一樣,所以兩個平台不能通用)
把模擬器調整到iphone5,編譯報錯
# 檢測.a的類型
$ lipo -info libCZTools.a
# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
如何讓產生.a檔案支援i386?
合并靜態庫
- 通過終端命令可以將靜態庫進行合并:
lipo -create 靜態庫1.a 靜態庫2.a -output 新靜態庫的名稱.a
2.查看產生後的靜態庫 :
測試產生後的靜態庫
-
- 把測試專案中原來的的.a檔案替換成為新的.a檔案
- 分別在4s,6s和真機下運行測試專案
# 合并.a的好處:開發過程中既可以在真機上調試,也可以在模擬器上調試
# 合并.a的壞處:如果靜態庫太大,合并打包後,會非常大,因此很多第三方的靜態庫的.a是區分版本的
# 今後在使用.a時一定注意版本
6.如何產生發布版靜態庫
- 預設情況下產生的版本都是
調試版靜態庫,如何產生發布版的靜態呢?
步驟:
- 編輯scheme
配置運行為發布
- 再編譯靜態庫(類比與真機上都要),產生發布版靜態庫
- 發布版真機版 Release-iphoneos
- 發布版模擬器版 Release-iphonesimulator
補充:
01-架構解析
Undefined symbols for architecture i386 : 未定義的符號在i386架構
現在的靜態庫在i386架構上面是不可以使用
模擬器:
iPhone4s-->iPhone5 : i386
iPhone5s-->iPhone6plus : x86_64
真機:
iPhone3gs-->iPhone4s : armv7
iPhone5-->iPhone5c : armv7s
iPhone5s-->iPhone6splus : arm64
通過下列命令查看靜態庫支援哪些架構:lipo -info 靜態庫.a
通過下列命令可以將靜態庫進行合并:
lipo -create 靜態庫1.a 靜態庫2.a -output 新靜態庫的名稱.a
02-靜態庫的種類
================================================================================
靜態庫檔案的版本(4種)
1.真機-Debug版本
2.真機-Release版本
3.模擬器-Debug版本
4.模擬器-Release版本
調試版本(Debug版本) VS 發布版本(Release版本)
--------------------------------------------------------------------------------
- 調試版本會包含完整的符號資訊,以方便調試
- 調試版本不會對代碼進行最佳化
- 發布版本不會包含完整的符號資訊
- 發布版本的執行代碼是進行過最佳化的
- 發布版本的大小會比調試版本的略小
- 在執行速度方面,發布版本會更快些,但不意味著會有顯著的提升
iOS實用技能擴充-靜態庫的製作與簡單使用