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

一、簡單介紹

1.什么是庫?

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

2.庫的分類

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

(1)開源庫

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

比如SDWebImage瘸右、AFNetworking

(2)閉源庫

不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件岩齿,看不到具體實(shí)現(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)庫:鏈接時(shí)盹沈,靜態(tài)庫會被完整地復(fù)制到可執(zhí)行文件中龄章,被多次使用就有多份冗余拷貝(圖1所示)

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

圖1

圖2

注意點(diǎn):項(xiàng)目中如果使用了自制的動態(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>

這個(gè)時(shí)候飞蚓,程序會報(bào)錯(cuò)滤港,因?yàn)榭蚣苤邪薈GFloat,它是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)合并兩個(gè)文件

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

在終端輸入指令:

lipo -createDebug-iphoneos/libMJRefresh.aDebug-iphonesimulator/libMJRefresh.a-outputlibMJRefresh.a

說明:

藍(lán)色部分是固定指令

紅色问麸、紫色是真機(jī)和模擬器.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、資源文件拖拽到其他項(xiàng)目中即可

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

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

四哮笆、制作靜態(tài)庫的注意點(diǎn)

(1)注意:

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

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

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

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

(3)圖片資源的處理

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

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

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

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

2)修改擴(kuò)展名為?.bundle衡创,敲回車,點(diǎn)擊添加璃氢。

(4)多文件處理

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

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

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

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舆蝴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洁仗,老刑警劉巖层皱,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異京痢,居然都是意外死亡奶甘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門祭椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臭家,“玉大人疲陕,你說我怎么就攤上這事《ち蓿” “怎么了蹄殃?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長你踩。 經(jīng)常有香客問我诅岩,道長,這世上最難降的妖魔是什么带膜? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任娱据,我火速辦了婚禮,結(jié)果婚禮上挪蹭,老公的妹妹穿的比我還像新娘承冰。我一直安慰自己,他們只是感情好芭挽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布滑废。 她就那樣靜靜地躺著,像睡著了一般袜爪。 火紅的嫁衣襯著肌膚如雪蠕趁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天辛馆,我揣著相機(jī)與錄音俺陋,去河邊找鬼。 笑死怀各,一個(gè)胖子當(dāng)著我的面吹牛倔韭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓢对,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寿酌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硕蛹?” 一聲冷哼從身側(cè)響起醇疼,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎法焰,沒想到半個(gè)月后秧荆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埃仪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年乙濒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片么库。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诉儒,死狀恐怖亏掀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情温算,我是刑警寧澤间影,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響胰丁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜机蔗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一甘萧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牙言,春花似錦怪得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亿乳。三九已至葛假,卻和暖如春障陶,著一層夾襖步出監(jiān)牢的瞬間咸这,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工媳维, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侄刽,地道東北人朋凉。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像墓毒,于是被迫代替她去往敵國和親亲怠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容