iOS中.a和.framework靜態(tài)庫(kù)的創(chuàng)建與.bundle資源包的使用詳解
前言
開發(fā)中經(jīng)常使用三方庫(kù)去實(shí)現(xiàn)某特定功能,而這些三方庫(kù)通常又分為開源庫(kù)和閉源庫(kù)。開源庫(kù)可以直接拿到源碼,和自己寫的沒有什么區(qū)別,我們可以最大程度的修改源碼來(lái)適應(yīng)自己功能。閉源庫(kù)就是被發(fā)布者提前打包好的靜態(tài)庫(kù)或 Bundle 包,對(duì)此我們無(wú)法看到內(nèi)部實(shí)現(xiàn),對(duì)于其封裝好的特定功能,我們也只需要調(diào)用其開放的API即可。
在正式的上代碼之前,先介紹一些從網(wǎng)上搜集的靜態(tài)庫(kù)相關(guān)的基本概念,以加深對(duì)后面知識(shí)的理解
1. 庫(kù)
庫(kù)實(shí)際上是一種代碼共享的方式,主要用于代碼重用和源碼隱藏,通常分為動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)。
2. 區(qū)別
靜態(tài)庫(kù):鏈接時(shí)完整的拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存空間。
3. iOS中靜態(tài)庫(kù)的形式
在iOS中靜態(tài)庫(kù)以.a和.framework的形式存在,動(dòng)態(tài)庫(kù)以.dylib和.framework的形式存在。
之所以.framework既可能是動(dòng)態(tài)庫(kù)又可能是靜態(tài)庫(kù),是因?yàn)樘O果公司禁止用戶級(jí)App使用動(dòng)態(tài)庫(kù),而自己卻又堂而皇之的使用動(dòng)態(tài)庫(kù),這就造成了iOS中系統(tǒng)級(jí)的.framework是動(dòng)態(tài)庫(kù),用戶級(jí)的.framework是靜態(tài)庫(kù)(無(wú)可奈何?。?。
本文就來(lái)講解一下 .a 和 .framework 靜態(tài)庫(kù)的創(chuàng)建與 .bundle 資源包的使用。
庫(kù)
庫(kù)分靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。從本質(zhì)上來(lái)說是一種可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。
靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)是相對(duì)編譯期和運(yùn)行期的:靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù);而動(dòng)態(tài)庫(kù)在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中,只是在程序運(yùn)行時(shí)才被載入,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在。
靜態(tài)庫(kù)的形式
形式為 :.a 和 .framework 兩種
其中 .framework 類型的庫(kù)如果是系統(tǒng)內(nèi)部的是動(dòng)態(tài)庫(kù),我們自己創(chuàng)建的是靜態(tài)庫(kù)
.a 和 .framework 的區(qū)別
.a是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework。
建議用.framework。
靜態(tài)庫(kù)的優(yōu)勢(shì)
- 方便共享代碼,便于合理使用。
- 實(shí)現(xiàn)iOS程序的模塊化。可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫(kù)。
- 和別人分享你的代碼庫(kù),但不想讓別人看到你代碼的實(shí)現(xiàn)。
- 開發(fā)第三方sdk的需要。
創(chuàng)建和打包 .a 靜態(tài)庫(kù)
- 創(chuàng)建靜態(tài)庫(kù)項(xiàng)目
iOS --> Framework & Library --> Cocoa Touch Static Library - 把需要編譯成靜態(tài)庫(kù)的代碼拖進(jìn)項(xiàng)目
- 設(shè)置可見的.h文件。
Build Phases --> Copy Files 添加.h文件即可。
1.修改支持的架構(gòu)
4.1 設(shè)置支持所有模擬器架構(gòu) Build Settings --> Build Active Architecture Only --> Debug 改為 NO
4.2設(shè)置支持所有手機(jī)架構(gòu)
2.編譯
編譯一次模擬器,編譯一次手機(jī)。
會(huì)生成.a文件 和 可見的頭文件。
使用命令行,合并剛剛生成的的兩個(gè)路徑,到另一個(gè)路徑,例如:
lipo -create 模擬器lib路徑 真機(jī)lib路徑 -output /Users/username/Desktop/libPSSTest.a
3.使用靜態(tài)庫(kù)
注意:如果這個(gè)靜態(tài)庫(kù)需要依賴庫(kù),也是需要引入依賴庫(kù)。
創(chuàng)建和打包 .framework 靜態(tài)庫(kù)
1.創(chuàng)建Framework項(xiàng)目
iOS --> Framework & Library --> Cocoa Touch Framework
2.修改打包的framework是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)
framework項(xiàng)目默認(rèn)是動(dòng)態(tài)庫(kù)。
靜態(tài)庫(kù)配置:Build Settings --> Mach-O Type --> 改為 Static Library
3.把需要編譯成靜態(tài)庫(kù)的代碼拖進(jìn)項(xiàng)目
設(shè)置可見頭文件
項(xiàng)目創(chuàng)建后,項(xiàng)目中只有一個(gè)主頭文件。
Build Phases --> Headers --> public 添加頭文件
4.編譯
編譯一次模擬器,編譯一次手機(jī)
5.使用
把framework引入項(xiàng)目。
如果是動(dòng)態(tài)庫(kù)需要在 General --> Embedded Binaries 中引入配置。
如果是靜態(tài)庫(kù)就不需要配置了。
靜態(tài)庫(kù)問題
1.靜態(tài)庫(kù)位置 Debug運(yùn)行真機(jī)編譯會(huì)把靜態(tài)庫(kù)生成到 Debug-iphoneos目錄下
Debug運(yùn)行模擬器編譯會(huì)把靜態(tài)庫(kù)生成到 Debug-iphonesimulator目錄下
Release運(yùn)行真機(jī)編譯會(huì)把靜態(tài)庫(kù)生成到 Release-iphoneos目錄下
Release運(yùn)行模擬器編譯會(huì)把靜態(tài)庫(kù)生成到 Release-iphonesimulator目錄下
2.Debug版本 VS Release版本
調(diào)試版
調(diào)試版本會(huì)包含完整的符號(hào)信息,以方便調(diào)試
調(diào)試版本不會(huì)對(duì)代碼進(jìn)行優(yōu)化
發(fā)布版
發(fā)布版本不會(huì)包含完整的符號(hào)信息 發(fā)布版本的執(zhí)行代碼是進(jìn)行過優(yōu)化的
發(fā)布版本的大小會(huì)比調(diào)試版本的略小
在執(zhí)行速度方面,調(diào)試版本會(huì)更快些,但不意味著會(huì)有顯著的提升
3.Undefind symbols for architecture arm64(i386)
原因:是靜態(tài)庫(kù)不支持cpu arm64(i386)架構(gòu)
4.iPhone手機(jī)的cpu架構(gòu)
模擬器
iPhone4s,5 是 i386架構(gòu)
iPhone5s以后 是x86_64架構(gòu)
發(fā)布版
iphone1代,3G,3GS 是 armv6架構(gòu)
iPhone4,4s 是 armv7架構(gòu)
iphone5,5s,5c 是 armv7s架構(gòu)
iPhone6,6s,6plus,6splus 是 arm64架構(gòu)
5.查看.a庫(kù)所支持的架構(gòu)類型
lipo -info xxx.a
6..a靜態(tài)庫(kù)合并
lipo -create 真機(jī)靜態(tài)庫(kù).a 模擬器靜態(tài)庫(kù).a -output 新文件.a
(最好指定一個(gè)目錄,否則會(huì)默認(rèn)當(dāng)前目錄)
只合并Debug版本 或者 只合并Release版本即可。
7.查看.framework庫(kù)所支持的架構(gòu)類型
7.1 進(jìn)入到framework文件夾中
7.2 lipo -info Framework 即可
靜態(tài)庫(kù)編譯錯(cuò)誤
1.MRC 錯(cuò)誤:會(huì)提示好多的autorelease,release,retain等錯(cuò)誤
解決方案:給這個(gè)文件MRC編譯 或者項(xiàng)目改成MRC環(huán)境
2.找不到 <libxml/HTMLparser.h>頭文件 編譯缺少系統(tǒng)庫(kù),配置:Build Settings --> 搜索Header Search Paths --> 配置 $(SDK_DIR)/usr/include/libxml2
3.framework項(xiàng)目,名字中不能帶特殊字符 會(huì)報(bào) test-framework is not a valid PROJECT_NAME
依賴庫(kù)錯(cuò)誤
1._SCNetWork開頭
導(dǎo)入SystemConfiguration.framework
2._UITypeCopy開頭 + _kUITag開頭
導(dǎo)入MobileCoreServices.framework
3._defalate開頭 + _inflate開頭
導(dǎo)入 libz.tbd
4._xml開頭
導(dǎo)入libxml2.tbd
引入靜態(tài)庫(kù)運(yùn)行錯(cuò)誤
1.運(yùn)行崩潰
假設(shè)不是靜態(tài)庫(kù)內(nèi)部錯(cuò)誤,那么就設(shè)置項(xiàng)目的Build Settings --> Other Linker Flags --> 為 -ObjC
資源靜態(tài)庫(kù).bundle
1.創(chuàng)建一個(gè)文件夾
2.把資源(圖片,plist...)放到文件夾中
3.把文件夾后綴改為bundle就可以了
4.資源庫(kù)的使用
在靜態(tài)庫(kù)中,我們獲得資源的方式改為從這個(gè)bundle資源包中獲得就可以了。
例如: [UIImage imageNamed:@"xxx.bundle/xxx"];
創(chuàng)建一個(gè)可測(cè)試的靜態(tài)庫(kù)
1.創(chuàng)建一個(gè)項(xiàng)目
2.給項(xiàng)目添加一個(gè)靜態(tài)庫(kù)Target
3.編譯靜態(tài)庫(kù)
4.配置引用靜態(tài)庫(kù)
General --> Linked Frameworks and Libraries --> 添加靜態(tài)庫(kù).a
5.運(yùn)行項(xiàng)目 -- 這樣就可以調(diào)試了.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
IOS實(shí)現(xiàn)視頻動(dòng)畫效果的啟動(dòng)圖
這篇文章實(shí)現(xiàn)的是一個(gè)關(guān)于啟動(dòng)頁(yè)或者引導(dǎo)頁(yè)的視頻動(dòng)畫效果的實(shí)現(xiàn)過程,對(duì)于大家開發(fā)APP具有一定的參考借鑒價(jià)值,有需要的可以來(lái)看看。2016-09-09詳解 objective-c中interface與protocol的作用
這篇文章主要介紹了詳解 objective-c中interface與protocol的作用的相關(guān)資料,需要的朋友可以參考下2017-05-05iOS UIAlertController中UITextField添加晃動(dòng)效果與邊框顏色詳解
這篇文章主要給大家介紹了關(guān)于iOS UIAlertController中UITextField添加晃動(dòng)效果與邊框顏色的相關(guān)資料,實(shí)現(xiàn)后的效果非常適合在開發(fā)中使用,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起看看吧。2017-10-10iOS中PNChart與UITableView的聯(lián)動(dòng)示例詳解
PNChart是個(gè)界面很漂亮的圖表第三方庫(kù),UITableView則不用過多介紹了,各位iOS開發(fā)者們都知道,下面這篇文章主要給大家介紹了關(guān)于iOS中PNChart與UITableView的聯(lián)動(dòng)的相關(guān)資料,需要的朋友可以參考下2018-07-07詳解ios中的SQL數(shù)據(jù)庫(kù)文件加密 (使用sqlcipher)
本篇文章主要介紹了ios中的SQL數(shù)據(jù)庫(kù)文件加密 (使用sqlcipher),具有一定的參考價(jià)值,這里整理了詳細(xì)的代碼,感興趣的小伙伴們可以參考一下。2016-12-12UICollectionView 實(shí)現(xiàn)圖片瀏覽效果
這篇文章主要為大家介紹了UICollectionView 實(shí)現(xiàn)圖片瀏覽效果示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07