iOS開發(fā)拓展篇—靜態(tài)庫

轉(zhuǎn)自 http://www.cnblogs.com/wendingding/p/3893095.html?

一、簡單介紹

1.什么是庫?

庫是程序代碼的集合,是共享程序代碼的一種方式

2.庫的分類

根據(jù)源代碼的公開情況,庫可以分為2種類型

(1)開源庫

公開源代碼,能看到具體實現(xiàn)

比如SDWebImage、AFNetworking

(2)閉源庫

不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到具體實現(xiàn)

主要分為:靜態(tài)庫、動態(tài)庫

二、靜態(tài)庫和動態(tài)庫

1.靜態(tài)庫和動態(tài)庫的存在形式

靜態(tài)庫:.a 和 .framework

動態(tài)庫:.dylib 和 .framework

2.靜態(tài)庫和動態(tài)庫在使用上的區(qū)別

靜態(tài)庫:鏈接時,靜態(tài)庫會被完整地復(fù)制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝(圖1所示)

動態(tài)庫:鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存(圖2所示)

圖1

圖2

注意點:項目中如果使用了自制的動態(tài)庫,不能被上傳到AppStore

三、靜態(tài)庫的制作(.a)

(1)選擇“Cocoa Touch Static Library”

(2)輸入靜態(tài)庫名稱(以MJRefresh為例)

(3)刪除自動生成的文件

(4)添加庫需要包含的源代碼

注意:資源文件是不能打包到.a文件中的。

(5)選擇需要暴露出來的.h文件,.m文件會自動編譯到.a文件中

添加,并選擇需要暴露的頭文件

設(shè)置(移動)為公開的。

(6)選擇真機(jī)設(shè)備,然后 Command+B 編譯,libMJRefresh.a文件從紅色變?yōu)楹谏?/p>

這個時候,程序會報錯,因為框架中包含了CGFloat,它是UIKit里面的東西,因此可以在pch文件中包含UIKit框架。

再次進(jìn)行編譯,編譯成功后生成的.a文件就是靜態(tài)庫。

(7)選擇模擬器,依然 Command+B ,模擬器和真機(jī)環(huán)境下用的.a文件是分開的

(8)右擊“Show In Finder”,查看制作好的.a文件

說明:

Debug-iphoneos文件夾里面的東西是用在真機(jī)上的

Debug-iphonesimulator文件夾里面的東西是用在模擬器上的

如果Scheme是Release模式,生成的文件夾就以Release開頭

(9)合并兩個文件

如果想讓一個.a文件能同時用在真機(jī)和模擬器上,需要進(jìn)行合并

在終端輸入指令:

lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

說明:

lipo -create、-output是固定指令

Debug-iphoneos/libMJRefresh.a、Debug-iphonesimulator/libMJRefresh.a是真機(jī)和模擬器.a文件的路徑

libMJRefresh.a是所合成.a文件的路徑

生成的文件(靜態(tài)庫)

提示:

1)文件大小.a文件的體積(一般情況下)

真機(jī)用的.a > 模擬器用的.a

所合成.a == 真機(jī)用的.a + 模擬器用的.a

2).a的類型

通過lipo –info libMJRefresh.a可以查看 .a 的類型(模擬器還是真機(jī))

(10)如何使用.a

直接將.a、.h、資源文件拖拽到其他項目中即可

別人拿到的框架,只有.a文件和暴露出來的頭文件

注意:如果庫中還包含了一些資源文件(如圖片等),那么資源文件也應(yīng)該放在上面的文件夾中。

四、制作靜態(tài)庫的注意點

(1)注意:

無論是 .a 靜態(tài)庫還是 .framework 靜態(tài)庫,最終需要的都是:二進(jìn)制文件 + .h + 其它資源文件

(2).a 和 .framework 的使用區(qū)別

.a 本身是一個二進(jìn)制文件,需要配上 .h 和 其它資源文件 才能使用

.framework 本身已經(jīng)包含了 .h 和 其它資源文件,可以直接使用

(3)圖片資源的處理

如果靜態(tài)庫中用到了圖片資源,一般都放到一個bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致

bundle的創(chuàng)建:新建一個文件夾,修改擴(kuò)展名為 .bundle 即可,右擊bundle文件,顯示包內(nèi)容,就可以往bundle文件中放東西

建議:自己制作的靜態(tài)庫中要用到的圖片資源,不建議直接以png的后綴名方式拖到項目中使用,而是推薦使用放到bundle文件中。這樣可以避免靜態(tài)庫的圖片名和使用靜態(tài)庫的項目中存在的圖片產(chǎn)生沖突。

1)新建一個文件夾,把需要打包的資源圖片放在里面

2)修改擴(kuò)展名為?.bundle,敲回車,點擊添加。

(4)多文件處理

如果靜態(tài)庫需要暴露出來的 .h 比較多,可以考慮創(chuàng)建一個主頭文件(一般 主頭文件 和 靜態(tài)庫 同名)

在主頭文件中包含所有其他需要暴露出來的 .h 文件

使用靜態(tài)庫時,只需要#import 主頭文件

實際上蘋果官方就是這么做的,例如:#import

(5).framework為什么既是靜態(tài)庫又是動態(tài)庫

系統(tǒng)的 .framework 是動態(tài)庫

我們自己建立的 .framework 是靜態(tài)庫

(6)靜態(tài)庫中包含了Category(分類)

如果靜態(tài)庫中包含了Category,有時候在使用靜態(tài)庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance

解決方案:在使用靜態(tài)庫的工程中配置Other Linker Flags為-ObjC

最后編輯于
?著作權(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)容