所謂庫就是程序代碼的集合,是共享程序代碼的一種方式邮辽。根據(jù)程序代碼的開源情況唠雕,庫可以分開源庫(源代碼是公開的贸营,你可以看到具體實(shí)現(xiàn))和閉源庫(不公開源代碼,只公開調(diào)用的接口岩睁,看不到具體的實(shí)現(xiàn)钞脂,是一個(gè)編譯后的二進(jìn)制文件)。同時(shí)庫又有靜態(tài)和動(dòng)態(tài)之分捕儒,靜態(tài)庫以".a"或者“.framework”為文件后綴名冰啃,動(dòng)態(tài)庫以".dylib"或者“.framework”為文件后綴名,靜態(tài)庫鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中刘莹,被多次使用就有多份拷貝阎毅,動(dòng)態(tài)庫鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存点弯,供程序調(diào)用扇调。而且系統(tǒng)只加載一次,多個(gè)程序共用抢肛,節(jié)省內(nèi)存狼钮。
下面詳細(xì)介紹一下靜態(tài)庫的打包和使用過程:
一、打包.a文件
新建一個(gè)工程捡絮,選擇Cocoa Touch Static Library創(chuàng)建
建完之后的樣子
在自動(dòng)生成的MethodsTool文件中寫一個(gè)方法:
然后在創(chuàng)建一個(gè)CustomView的視圖文件(這種文件自己想怎么弄怎么弄熬芜,這里只是隨便創(chuàng)建一個(gè)當(dāng)例子),添加一個(gè)方法:
注意點(diǎn):適配所有模擬器架構(gòu)(如果選擇Yes锦援,只適配部分機(jī)型猛蔽,選擇NO則適配所有機(jī)型):
選擇編譯模式,編譯模式有Debug版本和Release版本:
Debug是調(diào)試版本灵寺,主要讓程序員使用。在調(diào)試的過程中Debug會(huì)啟動(dòng)更多的服務(wù)來監(jiān)控錯(cuò)誤区岗,運(yùn)行速度較慢略板,而且比較耗能。
Release是發(fā)布版本慈缔,主要讓用戶使用叮称,在使用的過程中會(huì)去掉那些繁瑣的監(jiān)控服務(wù),運(yùn)行速度相對(duì)較快藐鹤,而且比較節(jié)約內(nèi)存瓤檐。
這里,我們?cè)贒ebug版本和Release版本下娱节,使用模擬器和真機(jī)進(jìn)行編譯挠蛉,會(huì)生成Debug和Release兩種模式下模擬器和真機(jī)版本的靜態(tài)庫。
這里我們將模式切換成release
接下來添加需要公開接口的頭文件(.h文件),如果一個(gè)靜態(tài)庫很復(fù)雜肄满,需要暴露的.h比較多的話谴古,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個(gè).h文件(一般這個(gè).h文件的名字和靜態(tài)庫的名字相同)质涛,然后把所有需要暴露出來的.h文件都集中放在這個(gè).h文件中,而那些原本需要暴露的.h都不需要再暴露了掰担,只需要把.h暴露出來就可以了
準(zhǔn)備工作就緒汇陆,接下來分別選一個(gè)模擬器和Generic iOS Device編譯一下,分別代表真機(jī)和模擬器带饱,編譯成功后可以看到.a文件由紅色變成了黑色
選中.a文件右鍵Show in Finder,可以看到release模式下分別生成了真機(jī)和模擬器的靜態(tài)庫.a文件和include文件毡代,其中include文件中包含的是公開的頭文件
如果想生成Debug模式下的靜態(tài)庫可以將模式切換成debug,然后分別選擇一個(gè)模擬器和Generic iOS Device編譯一下
下面進(jìn)行真機(jī)和模擬器靜態(tài)庫的合并:
打開終端輸入命令: lipo -create 真機(jī).a文件路徑 模擬器.a文件路徑 -output 合并后的文件路徑
注:合并后的文件路徑一般可以是:桌面路徑+合并后的文件名.a勺疼,如/Users/mac1/Desktop/libMethodTool.a ,libMethodTool.a是需要你自己在終端上輸入的教寂,想當(dāng)年看別人的教程傻傻的先在桌面建一個(gè).a文件夾,然后拖入終端獲取路徑恢口,后來發(fā)現(xiàn)不是這樣孝宗,額!8纭因妇!
合并成功后會(huì)生成一個(gè).a文件libMethodTool.a,然后新建一個(gè)文件夾猿诸,將合并生成的.a文件和include中包含的公開的頭文件都放在里面婚被,這個(gè)文件夾就是最終成品,用的時(shí)候只要將該文件拖入目標(biāo)工程就可以使用了梳虽。
在你生成庫文件的工程中址芯,創(chuàng)建一個(gè)App項(xiàng)目,并導(dǎo)入靜態(tài)庫使用:
通過上面的步驟App已經(jīng)創(chuàng)建成功窜觉,并成功導(dǎo)入靜態(tài)庫谷炸,執(zhí)行相應(yīng)的操作后結(jié)果如圖
當(dāng)你的靜態(tài)庫中用到自定義的控件或者分類時(shí)候,你會(huì)發(fā)現(xiàn)禀挫,導(dǎo)入靜態(tài)庫的時(shí)候旬陡,你的工程會(huì)報(bào)錯(cuò)。
解決辦法:
Build Setting—>Other Linker Flags 選項(xiàng)添加:-all_load 或者 -ObjC语婴。
二描孟、打包Framework文件
新建一個(gè)工程,選擇Cocoa Touch Framework
在系統(tǒng)生成的主頭文件中導(dǎo)入新添加文件的頭文件
設(shè)置打包的是靜態(tài)庫
適配所有模擬器架構(gòu)
根據(jù)需求切換編譯模式砰左,release or debug
添加需要公開的頭文件(.h文件)
接下來分別選一個(gè)模擬器和Generic iOS Device編譯一下匿醒,分別代表真機(jī)和模擬器,編譯成功后可以看到.framework文件由紅色變成了黑色缠导,選中該文件Show in Finder
此時(shí)生成的.framework文件就可以使用了
下面介紹一下合并真機(jī)和模擬器的framework庫文件廉羔,這里合并和.a方法類似,只是內(nèi)容上有所區(qū)別酬核,framework靜態(tài)庫合并的不是.framework文件,而是framework下的一個(gè)二進(jìn)制文件:
打開終端輸入命令: lipo -create 真機(jī)framework下二進(jìn)制文件路徑 模擬器framework下二進(jìn)制文件路徑 -output 合并后的文件路徑
新創(chuàng)建一個(gè)文件夾蜜另,將生成的文件和原framework下的Headers适室、Info.plist、Modules全部放入其中举瑰,這就是成品捣辆,用的時(shí)候直接將該文件夾拖入目標(biāo)工程即可使用,在生成framework庫的工程中創(chuàng)建App此迅,過程和之前的類似汽畴,創(chuàng)建好APP后導(dǎo)入framework即可調(diào)用。