iOS 静态库和动态库的基本介绍和使用
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
什么是庫 ?
?
庫就是程序代碼的集合,將N個文件組織起來,是共享程序代碼的一種方式。
庫的分類
- 開源庫:源代碼是公開的,可以看到每個實現(xiàn)文件(.m文件)的實現(xiàn),例如GitHub上的常用的開源庫:AFNetworking、SDWebImage等;
- 閉源庫:不公開源代碼,是經(jīng)過編譯后的二進制文件,看不到具體的實現(xiàn)。閉源庫又分為:靜態(tài)庫 和 動態(tài)庫
靜態(tài)庫存在的形式
- .a
- .framework
動態(tài)庫的存在形式
- .dylib
- .framework
靜態(tài)庫和動態(tài)庫的區(qū)別
- .a文件肯定是靜態(tài)庫,.dylib肯定是動態(tài)庫,.framework可能是靜態(tài)庫也可能是動態(tài)庫;
- 靜態(tài)庫在鏈接時,會被完整的復(fù)制到可執(zhí)行文件中,如果多個App都使用了同一個靜態(tài)庫,那么每個App都會拷貝一份,缺點是浪費內(nèi)存。類似于定義一個基本變量,使用該基本變量是是新復(fù)制了一份數(shù)據(jù),而不是原來定義的;
- 動態(tài)庫不會復(fù)制,只有一份,程序運行時動態(tài)加載到內(nèi)存中,系統(tǒng)只會加載一次,多個程序共用一份,節(jié)約了內(nèi)存。類似于使用變量的內(nèi)存地址一樣,使用的是同一個變量;
- 但是項目中如果使用了自己定義的動態(tài)庫,蘋果是不允許上架的,在iOS8.0以后蘋果開放了動態(tài)加載.dylib的接口,用于掛載.dylib動態(tài)庫
靜態(tài)庫的運用場景
- 保護自己的核心代碼,如訊飛語言摸索了好多年探索出的結(jié)果當然要保護起來了,都公開了公司還怎么生存。
- 將MRC的項目打包成靜態(tài)庫,可以在ARC下直接使用,不用轉(zhuǎn)換。如別人使用MRC寫的開源庫,放到自己ARC項目中,需要對每個文件加一個編譯參數(shù) -fno-objc-arc,這樣相對來說麻煩,將整個工程打包成靜態(tài)庫直接放到項目中即可,也不用對每個文件添加編譯選項。
靜態(tài)庫的特點
.a + .h
.a : 可以看做所有.m文件加密后的一個二進制文件?
.h : 頭文件用戶暴漏可用的接口(方法)?
制作靜態(tài)庫.a
?
3. 指定靜態(tài)庫需要公開的頭文件?
?
4. 選擇模擬器iphone6s, 然后 Command + B 編譯靜態(tài)庫, 可以看到iFly.a文件名由紅色變?yōu)楹谏?#xff0c;右鍵 Show In Finder?
?
5. 使用靜態(tài)庫,新建一個工程,然后將iFly.a 和 include頭文件拖進項目中,然后使用iFly.h公開的方法,然后選擇iphone6s 模擬器運行?
制作靜態(tài)庫相關(guān)問題
架構(gòu)是神馬東東?
CPU架構(gòu)是CPU廠商給屬于同一系列的CPU產(chǎn)品定的一個規(guī)范,主要目的是為了區(qū)分不同類型CPU的重要標示。模擬器上的架構(gòu)和真機上的架構(gòu)是不一樣的,模擬器和模擬器之間,真機和真機之間的架構(gòu)也是不同的。如果靜態(tài)庫的架構(gòu)和測試項目對應(yīng)的模擬器或真機上的架構(gòu)不對應(yīng)就會報“未定義的符號XXX架構(gòu)”, 由此可以得出模擬器上的靜態(tài)庫!
模擬器架構(gòu)
- iPhone4s ~ 5 : i386
- iPhone5s ~ 7Plus : x86_64?
真機架構(gòu)
- 3GS~4s : armv7
- 5/5c : armv7s(armv7兼容armv7s)
- 5s ~ 6sPlus : arm64
使用iPhone6s打包的靜態(tài)庫架構(gòu)是:x86_64, 測試項目選擇的是模擬器iPhone5對應(yīng)的架構(gòu)是:i386, 架構(gòu)不匹配所以報Undefined symbols for architecture i386
查看靜態(tài)庫對應(yīng)的架構(gòu)?
在終端上使用命令: lipo -info Xxx.a?
input file libiFly.a is not a fat file:輸入文件libiFly.a不是一個胖文件,胖文件是指只支持一個架構(gòu),不兼容其它架構(gòu)。
讓靜態(tài)庫支持所有模擬器對應(yīng)的架構(gòu)
Build Settings—>Build Active Architecture Only(只構(gòu)建活躍的架構(gòu))—-> NO?
什么叫只構(gòu)建活躍的架構(gòu)?所謂活躍的架構(gòu)是指當前選中的模擬器的架構(gòu),你選中的就稱為活躍的,你沒有選中的那些稱為不活躍的,重新編譯(Command + B)一下靜態(tài)庫,可以拖到測試項目中選中各種模擬器進行測試都是正常的。?
重新編譯之后查看靜態(tài)庫支持的架構(gòu),同時支持i386和x86_64,是一個胖文件?
靜態(tài)庫的版本
靜態(tài)庫有4種版本:
- 調(diào)試版本:不會對代碼進行優(yōu)化?
- 模擬器版本
- 真機版本?
- 發(fā)布版本 :會對代碼進行優(yōu)化,執(zhí)行效率相對調(diào)試版本快,但不會有明顯的差別?
- 模擬器版本
- 真機版本?
選中模擬器編譯默認是調(diào)試版-模擬器版本,選中Generic?iOS?Device默認是是調(diào)試版本-真機版本
生成Release版本的靜態(tài)庫
首先編輯靜態(tài)庫對應(yīng)的Scheme為Release,然后分別選擇模擬器或真機Command + B 進行編譯
合并靜態(tài)庫
我們知道模擬器版本的靜態(tài)庫和真機版的是不能通用的,那么怎樣讓一個靜態(tài)庫即支持模擬器又支持真機呢?
使用終端 lipo -create Xxx1.a Xxx2.a -output Xxx.a?
?
合并后同時支持i386、armv7、x86_64、arm64 這四種架構(gòu),合并就是將兩個.a文件相加,合并后文件的大小是兩個文件之和。通常自己制作靜態(tài)庫給別人用一般是給兩個發(fā)布版對應(yīng)的模擬器和真機版本,不給合并版本,因為用戶想合并可以自己進行合并,如果給用戶一個合并版的,用戶則無法分解的。
制作靜態(tài)庫.framework
?
?
?
iFly.h 是一個總的頭文件,可以將其他需要公開的文件都統(tǒng)一寫到總的頭文件中,用戶在使用的時候就導入這一個總的頭文件即可
?
制作動態(tài)庫.framework
制作動態(tài)庫和上面步驟差不多,不同的是在編譯framework時要指定Mach-O Type: Dynamic Type?
將.framework文件添加到General—> Embedded Binaries 中,不添加會報錯
.bundle
在使用第三方庫時有可能會有一個.bundle文件,.bundle其實是一個物理文件夾,里面可以放圖片等資源。因為.bundle是一個物理文件夾,所以當被拖入到項目中就不會和自己項目中的圖片重名。
.a 和 .framework
使用.a時需要同時將.a 和 .h 文件拖入到工程中,使用.framework時直接將這個文件夾拖入進去即可,因為.framework文件夾中已經(jīng)包含了.h文件。
.a + .h + .bundle = .framework, 使用.framework更加方便
靜態(tài)庫如何一邊開發(fā)一邊進行調(diào)試
創(chuàng)建一個復(fù)合項目?
1. 創(chuàng)建一個普通工程Single View Application?
2. 在TARGETS中添加一個靜態(tài)庫?
--
?
3. 在普通Target中添加目標依賴 Target Dependencies,選中剛才的靜態(tài)庫?
4. 在普通Target–> Link Binary With Libraries 中添加靜態(tài)庫?
?
5. 在ViewController#viewDidLoad中測試?
?
?
6. 至此靜態(tài)庫開發(fā)好,測試完成后修改靜態(tài)庫對應(yīng)的Build Active Architecture Only:NO?
7. 修改Scheme為Release?
8. 暴漏頭文件:Build Phases —> Copy Files?
9. 分別對Release的真機和模擬器進行Command + B
Swift不支持靜態(tài)庫只支持動態(tài)庫
Swift?is not supported for static libraries.?
Swift暴漏方法的方式:Swift不像OC那樣有頭文件,將Swift中的類和方法用public修飾就可以將類和方法暴漏出來?
public class Tool : NSObject {?
public func tool(){?
print(“Test”)?
}?
}
轉(zhuǎn)載于:https://my.oschina.net/llfk/blog/917925
總結(jié)
以上是生活随笔為你收集整理的iOS 静态库和动态库的基本介绍和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gitlab与已安装nginx(teng
- 下一篇: ArcEngine开发 退出系统报错