文章出處
4. 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換
文章列表
一.靜態庫簡介
1. 什么是庫?
庫 就是程序代碼的集合, 是共享程序代碼的一種方式
2. 庫的分類?
-
開源庫
公開源代碼, 能看到具體實現
例如MJExtension, MJRefresh, AFNetworking...
-
閉源庫
不公開源代碼, 是經過編譯后的二進制文件, 看不到具體實現
主要分為: 靜態庫 和 動態庫
3. 靜態庫的存在形式?
- .a
- .framework
4. 動態庫的存在形式?
- .dylib
- .framework
5. 靜態庫和動態庫的區別?
-
靜態庫在鏈接時, 會被完整的復制到可執行文件中; 被多次使用, 就有多份拷貝;
-
動態庫則不會復制, 只有一份. 程序運行時動態加載到內存; 系統只加載一次, 多個程序共用, 節省內存;
-
但是!!!! 項目中如果使用到自己的動態庫, 不允許上架!
- 再但是!!! WWDC2014上公布的 蘋果對ios8開放動態加載dylib的接口 也就是說 開放了動態庫掛載
6. 靜態庫應用場景?
-
保護自己的核心代碼
國內的企業,掌握有核心技術,同時是又希望更多的程序員來使用其技術,因此采用"閉源"的方式開發使用
例如:百度地圖,友盟,JPush等
- 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換
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: arm64
4.查看靜態庫支持的架構
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 = .framework
4> 建議使用.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
文章列表
全站熱搜