所謂庫就是程序代碼的集合,是共享程序代碼的一種方式。根據(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)建

建完之后的樣子

在自動生成的MethodsTool文件中寫一個方法:


然后在創(chuàng)建一個CustomView的視圖文件(這種文件自己想怎么弄怎么弄,這里只是隨便創(chuàng)建一個當(dāng)例子),添加一個方法:


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

選擇編譯模式,編譯模式有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


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


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

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


如果想生成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中包含的公開的頭文件都放在里面,這個文件夾就是最終成品,用的時候只要將該文件拖入目標工程就可以使用了。

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




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

當(dāng)你的靜態(tài)庫中用到自定義的控件或者分類時候,你會發(fā)現(xiàn),導(dǎo)入靜態(tài)庫的時候,你的工程會報錯。
解決辦法:
Build Setting—>Other Linker Flags 選項添加:-all_load 或者 -ObjC。
二、打包Framework文件
新建一個工程,選擇Cocoa Touch Framework

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

設(shè)置打包的是靜態(tài)庫

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

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

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

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

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

打開終端輸入命令: lipo -create 真機framework下二進制文件路徑 模擬器framework下二進制文件路徑 -output 合并后的文件路徑
新創(chuàng)建一個文件夾,將生成的文件和原framework下的Headers、Info.plist、Modules全部放入其中,這就是成品,用的時候直接將該文件夾拖入目標工程即可使用,在生成framework庫的工程中創(chuàng)建App,過程和之前的類似,創(chuàng)建好APP后導(dǎo)入framework即可調(diào)用。