iOS生成靜態(tài)庫(.a文件和Framework)

所謂庫就是程序代碼的集合,是共享程序代碼的一種方式。根據(jù)程序代碼的開源情況,庫可以分開源庫(源代碼是公開的,你可以看到具體實現(xiàn))和閉源庫(不公開源代碼,只公開調(diào)用的接口,看不到具體的實現(xiàn),是一個編譯后的二進制文件)。同時庫又有靜態(tài)和動態(tài)之分,靜態(tài)庫以".a"或者“.framework”為文件后綴名,動態(tài)庫以".dylib"或者“.framework”為文件后綴名,靜態(tài)庫鏈接時會被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝,動態(tài)庫鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用。而且系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存。

下面詳細介紹一下靜態(tài)庫的打包和使用過程:

一、打包.a文件
新建一個工程,選擇Cocoa Touch Static Library創(chuàng)建


屏幕快照 2018-06-07 下午3.17.21.png

建完之后的樣子


屏幕快照 2018-06-07 下午3.24.49.png

在自動生成的MethodsTool文件中寫一個方法:
屏幕快照 2018-06-07 下午3.30.11.png
屏幕快照 2018-06-07 下午3.30.22.png

然后在創(chuàng)建一個CustomView的視圖文件(這種文件自己想怎么弄怎么弄,這里只是隨便創(chuàng)建一個當(dāng)例子),添加一個方法:
屏幕快照 2018-06-07 下午3.30.31.png
屏幕快照 2018-06-07 下午3.30.40.png

注意點:適配所有模擬器架構(gòu)(如果選擇Yes,只適配部分機型,選擇NO則適配所有機型):


屏幕快照 2018-06-07 下午3.36.24.png

選擇編譯模式,編譯模式有Debug版本和Release版本:

Debug是調(diào)試版本,主要讓程序員使用。在調(diào)試的過程中Debug會啟動更多的服務(wù)來監(jiān)控錯誤,運行速度較慢,而且比較耗能。

Release是發(fā)布版本,主要讓用戶使用,在使用的過程中會去掉那些繁瑣的監(jiān)控服務(wù),運行速度相對較快,而且比較節(jié)約內(nèi)存。

這里,我們在Debug版本和Release版本下,使用模擬器和真機進行編譯,會生成Debug和Release兩種模式下模擬器和真機版本的靜態(tài)庫。

這里我們將模式切換成release


屏幕快照 2018-06-07 下午3.47.06.png
屏幕快照 2018-06-07 下午3.47.54.png

接下來添加需要公開接口的頭文件(.h文件),如果一個靜態(tài)庫很復(fù)雜,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了


屏幕快照 2018-06-07 下午3.57.28.png
屏幕快照 2018-06-07 下午3.57.41.png

準備工作就緒,接下來分別選一個模擬器和Generic iOS Device編譯一下,分別代表真機和模擬器,編譯成功后可以看到.a文件由紅色變成了黑色


屏幕快照 2018-06-07 下午4.04.08.png

選中.a文件右鍵Show in Finder,可以看到release模式下分別生成了真機和模擬器的靜態(tài)庫.a文件和include文件,其中include文件中包含的是公開的頭文件


屏幕快照 2018-06-07 下午4.06.06.png
屏幕快照 2018-06-07 下午4.06.20.png

如果想生成Debug模式下的靜態(tài)庫可以將模式切換成debug,然后分別選擇一個模擬器和Generic iOS Device編譯一下

下面進行真機和模擬器靜態(tài)庫的合并:
打開終端輸入命令: lipo -create 真機.a文件路徑 模擬器.a文件路徑 -output 合并后的文件路徑
注:合并后的文件路徑一般可以是:桌面路徑+合并后的文件名.a,如/Users/mac1/Desktop/libMethodTool.a ,libMethodTool.a是需要你自己在終端上輸入的,想當(dāng)年看別人的教程傻傻的先在桌面建一個.a文件夾,然后拖入終端獲取路徑,后來發(fā)現(xiàn)不是這樣,額?。?!

合并成功后會生成一個.a文件libMethodTool.a,然后新建一個文件夾,將合并生成的.a文件和include中包含的公開的頭文件都放在里面,這個文件夾就是最終成品,用的時候只要將該文件拖入目標工程就可以使用了。


屏幕快照 2018-06-07 下午4.45.49.png

在你生成庫文件的工程中,創(chuàng)建一個App項目,并導(dǎo)入靜態(tài)庫使用:

屏幕快照 2018-06-07 下午4.54.57.png
屏幕快照 2018-06-07 下午4.55.16.png
屏幕快照 2018-06-07 下午4.56.10.png
屏幕快照 2018-06-07 下午5.03.01.png

通過上面的步驟App已經(jīng)創(chuàng)建成功,并成功導(dǎo)入靜態(tài)庫,執(zhí)行相應(yīng)的操作后結(jié)果如圖


屏幕快照 2018-06-07 下午5.06.47.png

當(dāng)你的靜態(tài)庫中用到自定義的控件或者分類時候,你會發(fā)現(xiàn),導(dǎo)入靜態(tài)庫的時候,你的工程會報錯。

解決辦法:
Build Setting—>Other Linker Flags 選項添加:-all_load 或者 -ObjC。

二、打包Framework文件

新建一個工程,選擇Cocoa Touch Framework


屏幕快照 2018-06-07 下午5.32.32.png

在系統(tǒng)生成的主頭文件中導(dǎo)入新添加文件的頭文件


屏幕快照 2018-06-07 下午6.29.04.png

設(shè)置打包的是靜態(tài)庫
屏幕快照 2018-06-07 下午5.36.13.png

適配所有模擬器架構(gòu)


屏幕快照 2018-06-07 下午5.40.24.png

根據(jù)需求切換編譯模式,release or debug


屏幕快照 2018-06-07 下午5.44.27.png

添加需要公開的頭文件(.h文件)


屏幕快照 2018-06-07 下午5.54.05.png

接下來分別選一個模擬器和Generic iOS Device編譯一下,分別代表真機和模擬器,編譯成功后可以看到.framework文件由紅色變成了黑色,選中該文件Show in Finder


屏幕快照 2018-06-07 下午5.49.13.png

此時生成的.framework文件就可以使用了

下面介紹一下合并真機和模擬器的framework庫文件,這里合并和.a方法類似,只是內(nèi)容上有所區(qū)別,framework靜態(tài)庫合并的不是.framework文件,而是framework下的一個二進制文件:


屏幕快照 2018-06-07 下午5.58.58.png

打開終端輸入命令: lipo -create 真機framework下二進制文件路徑 模擬器framework下二進制文件路徑 -output 合并后的文件路徑

新創(chuàng)建一個文件夾,將生成的文件和原framework下的Headers、Info.plist、Modules全部放入其中,這就是成品,用的時候直接將該文件夾拖入目標工程即可使用,在生成framework庫的工程中創(chuàng)建App,過程和之前的類似,創(chuàng)建好APP后導(dǎo)入framework即可調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容