您好,登錄后才能下訂單哦!
前言
開發中經常使用三方庫去實現某特定功能,而這些三方庫通常又分為開源庫和閉源庫。開源庫可以直接拿到源碼,和自己寫的沒有什么區別,我們可以最大程度的修改源碼來適應自己功能。閉源庫就是被發布者提前打包好的靜態庫或 Bundle 包,對此我們無法看到內部實現,對于其封裝好的特定功能,我們也只需要調用其開放的API即可。
在正式的上代碼之前,先介紹一些從網上搜集的靜態庫相關的基本概念,以加深對后面知識的理解
1. 庫
庫實際上是一種代碼共享的方式,主要用于代碼重用和源碼隱藏,通常分為動態庫和靜態庫。
2. 區別
靜態庫:鏈接時完整的拷貝至可執行文件中,被多次使用就有多份冗余拷貝。
動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存空間。
3. iOS中靜態庫的形式
在iOS中靜態庫以.a和.framework的形式存在,動態庫以.dylib和.framework的形式存在。
之所以.framework既可能是動態庫又可能是靜態庫,是因為蘋果公司禁止用戶級App使用動態庫,而自己卻又堂而皇之的使用動態庫,這就造成了iOS中系統級的.framework是動態庫,用戶級的.framework是靜態庫(無可奈何啊)。
本文就來講解一下 .a 和 .framework 靜態庫的創建與 .bundle 資源包的使用。
庫
庫分靜態庫和動態庫兩種。從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。
靜態庫和動態庫是相對編譯期和運行期的:靜態庫在程序編譯時會被鏈接到目標代碼中,程序運行時將不再需要改靜態庫;而動態庫在程序編譯時并不會被鏈接到目標代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態庫的存在。
靜態庫的形式
形式為 :.a 和 .framework 兩種
其中 .framework 類型的庫如果是系統內部的是動態庫,我們自己創建的是靜態庫
.a 和 .framework 的區別
.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
建議用.framework。
靜態庫的優勢
創建和打包 .a 靜態庫
1.修改支持的架構
4.1 設置支持所有模擬器架構 Build Settings --> Build Active Architecture Only --> Debug 改為 NO
4.2設置支持所有手機架構
2.編譯
編譯一次模擬器,編譯一次手機。
會生成.a文件 和 可見的頭文件。
使用命令行,合并剛剛生成的的兩個路徑,到另一個路徑,例如:
lipo -create 模擬器lib路徑 真機lib路徑 -output /Users/username/Desktop/libPSSTest.a
3.使用靜態庫
注意:如果這個靜態庫需要依賴庫,也是需要引入依賴庫。
創建和打包 .framework 靜態庫
1.創建Framework項目
iOS --> Framework & Library --> Cocoa Touch Framework
2.修改打包的framework是動態庫還是靜態庫
framework項目默認是動態庫。
靜態庫配置:Build Settings --> Mach-O Type --> 改為 Static Library
3.把需要編譯成靜態庫的代碼拖進項目
設置可見頭文件
項目創建后,項目中只有一個主頭文件。
Build Phases --> Headers --> public 添加頭文件
4.編譯
編譯一次模擬器,編譯一次手機
5.使用
把framework引入項目。
如果是動態庫需要在 General --> Embedded Binaries 中引入配置。
如果是靜態庫就不需要配置了。
靜態庫問題
1.靜態庫位置 Debug運行真機編譯會把靜態庫生成到 Debug-iphoneos目錄下
Debug運行模擬器編譯會把靜態庫生成到 Debug-iphonesimulator目錄下
Release運行真機編譯會把靜態庫生成到 Release-iphoneos目錄下
Release運行模擬器編譯會把靜態庫生成到 Release-iphonesimulator目錄下
2.Debug版本 VS Release版本
調試版
調試版本會包含完整的符號信息,以方便調試
調試版本不會對代碼進行優化
發布版
發布版本不會包含完整的符號信息 發布版本的執行代碼是進行過優化的
發布版本的大小會比調試版本的略小
在執行速度方面,調試版本會更快些,但不意味著會有顯著的提升
3.Undefind symbols for architecture arm64(i386)
原因:是靜態庫不支持cpu arm64(i386)架構
4.iPhone手機的cpu架構
模擬器
iPhone4s,5 是 i386架構
iPhone5s以后 是x86_64架構
發布版
iphone1代,3G,3GS 是 armv6架構
iPhone4,4s 是 armv7架構
iphone5,5s,5c 是 armv7s架構
iPhone6,6s,6plus,6splus 是 arm64架構
5.查看.a庫所支持的架構類型
lipo -info xxx.a
6..a靜態庫合并
lipo -create 真機靜態庫.a 模擬器靜態庫.a -output 新文件.a
(最好指定一個目錄,否則會默認當前目錄)
只合并Debug版本 或者 只合并Release版本即可。
7.查看.framework庫所支持的架構類型
7.1 進入到framework文件夾中
7.2 lipo -info Framework 即可
靜態庫編譯錯誤
1.MRC 錯誤:會提示好多的autorelease,release,retain等錯誤
解決方案:給這個文件MRC編譯 或者項目改成MRC環境
2.找不到 <libxml/HTMLparser.h>頭文件 編譯缺少系統庫,配置:Build Settings --> 搜索Header Search Paths --> 配置 $(SDK_DIR)/usr/include/libxml2
3.framework項目,名字中不能帶特殊字符 會報 test-framework is not a valid PROJECT_NAME
依賴庫錯誤
1._SCNetWork開頭
導入SystemConfiguration.framework
2._UITypeCopy開頭 + _kUITag開頭
導入MobileCoreServices.framework
3._defalate開頭 + _inflate開頭
導入 libz.tbd
4._xml開頭
導入libxml2.tbd
引入靜態庫運行錯誤
1.運行崩潰
假設不是靜態庫內部錯誤,那么就設置項目的Build Settings --> Other Linker Flags --> 為 -ObjC
資源靜態庫.bundle
1.創建一個文件夾
2.把資源(圖片,plist...)放到文件夾中
3.把文件夾后綴改為bundle就可以了
4.資源庫的使用
在靜態庫中,我們獲得資源的方式改為從這個bundle資源包中獲得就可以了。
例如: [UIImage imageNamed:@"xxx.bundle/xxx"];
創建一個可測試的靜態庫
1.創建一個項目
2.給項目添加一個靜態庫Target
3.編譯靜態庫
4.配置引用靜態庫
General --> Linked Frameworks and Libraries --> 添加靜態庫.a
5.運行項目 -- 這樣就可以調試了.
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。