iOS 靜態(tài)庫(kù)

本文章內(nèi)容參考網(wǎng)絡(luò)上搜集到的資料豺总。本人只是整理以现,已被日后查看之用狠怨。原文地址:靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別约啊?

什么是庫(kù)?

庫(kù)是共享程序代碼的方式佣赖。
庫(kù)從本質(zhì)上來(lái)說(shuō)是一種可執(zhí)行代碼的二進(jìn)制格式恰矩,可以被載入到內(nèi)存中執(zhí)行。庫(kù)分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)憎蛤。
iOS中的靜態(tài)庫(kù)有.a和.framework兩種形式外傅;動(dòng)態(tài)庫(kù)有.dylib和.framework形式,后來(lái).dylib動(dòng)態(tài)庫(kù)又被蘋(píng)果替換成.tbd的形式俩檬。

靜態(tài)庫(kù):連接時(shí)完整地拷貝至可執(zhí)行文件中萎胰,被多次使用就有多份冗余拷貝。
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制棚辽,程序運(yùn)行時(shí)技竟,由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用屈藐,系統(tǒng)只加載一次榔组,多個(gè)程序公用,節(jié)省內(nèi)存估盘〈苫迹【iOS暫時(shí)只允許使用系統(tǒng)動(dòng)態(tài)庫(kù)】;

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)是相對(duì)編譯期和運(yùn)行期的:靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被連接到目標(biāo)代碼中遣妥,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù)擅编;而動(dòng)態(tài)庫(kù)在編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,只是在程序運(yùn)行時(shí)才被載入箫踩,因?yàn)樵诔绦蜻\(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在爱态。
總結(jié):同一個(gè)靜態(tài)庫(kù)在不同程序中使用時(shí),每一個(gè)程序中都得導(dǎo)入一次境钟,打包時(shí)也被打包進(jìn)去锦担,形成一個(gè)程序。而動(dòng)態(tài)庫(kù)在不同程序中慨削,打包時(shí)并沒(méi)有被打包進(jìn)去洞渔,只在程序運(yùn)行時(shí),才鏈接載入(如系統(tǒng)的框架UIKit缚态、Foundation等)磁椒,所以程序體積會(huì)小很多,但蘋(píng)果不讓使用自己的動(dòng)態(tài)庫(kù)玫芦,否則審核就無(wú)法通過(guò)浆熔。

framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)?

系統(tǒng)的.framework是動(dòng)態(tài)庫(kù)桥帆,我們自己建立的.framework是靜態(tài)庫(kù)医增。

.a與.framework有什么區(qū)別慎皱?

.a是一個(gè)純二進(jìn)制文件, .framework中除了二進(jìn)制文件之外還有資源文件叶骨。
.a文件不能直接使用茫多,至少要有.h文件配合, .framework文件可以直接使用邓萨。
.a + .h + sourceFile = .framework

建議使用.framework

為什么要使用靜態(tài)庫(kù)地梨?

方便共享代碼,便于合理使用缔恳。
實(shí)現(xiàn)iOS程序的模塊化宝剖。可以吧固定的業(yè)務(wù)模塊化成靜態(tài)庫(kù)歉甚。
和別人分享你的代碼庫(kù)万细,但是不想讓別人看到你代碼的實(shí)現(xiàn),開(kāi)發(fā)第三方SDK的需要纸泄。

制作靜態(tài)庫(kù)時(shí)的幾點(diǎn)注意:

  • 1赖钞、注意理解:無(wú)論是.a靜態(tài)庫(kù)還是.framework靜態(tài)庫(kù),我們需要的都是二進(jìn)制文件+.h+其他資源文件的形式聘裁,不同的是雪营,.a本身就是二進(jìn)制文件,需要我們自己配上.h和其他文件才能使用衡便,而.framework本身已經(jīng)包含了.h和其他文件献起,可以直接使用。

  • 2镣陕、圖片資源的處理谴餐,兩種靜態(tài)庫(kù),一般都是把圖片文件單獨(dú)存放在一個(gè).bundle文件中呆抑,一般.bundle的名字和.a或.framework的名字相同岂嗓。.bundle文件很好弄,新建一個(gè)文件夾鹊碍,把它改名為.bundle就可以了厌殉,右鍵,顯示包內(nèi)容就可以向其中添加圖片資源侈咕。

  • 3年枕、category是我們實(shí)際開(kāi)發(fā)項(xiàng)目中經(jīng)常使用到的,把category打成靜態(tài)庫(kù)是沒(méi)有問(wèn)題的乎完,但是在這個(gè)靜態(tài)庫(kù)的工程中,調(diào)用category中的方法時(shí)會(huì)有找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized)品洛,解決辦法是:在靜態(tài)庫(kù)的工程中配置other linker flags的值為-ObjC树姨。

  • 4摩桶、如果一個(gè)靜態(tài)庫(kù)很復(fù)雜,需要暴露的.h比較多的話帽揪,就可以在靜態(tài)庫(kù)的內(nèi)部創(chuàng)建一個(gè).h文件(一般這個(gè).h文件的名字和靜態(tài)庫(kù)的名字相同)硝清,然后把所有需要暴露出來(lái)的.h文件都集中放在這個(gè).h文件中,而那些原本需要暴露的.h都不需要再暴露了转晰,只需要把.h暴露出來(lái)就可以了芦拿。

創(chuàng)建.a靜態(tài)庫(kù)

第一步,新建工程查邢。一般使用工程名就使用庫(kù)的名稱(chēng)蔗崎,比如我們這里用jingtaiku來(lái)創(chuàng)建靜態(tài)庫(kù),我們的工程名就取為jingtaiku扰藕,創(chuàng)建的.a靜態(tài)庫(kù)就是jingtaiku.a缓苛。

創(chuàng)建工程.png

第二步、導(dǎo)入需要打包的資源文件邓深,同時(shí)把資源文件需要外界訪問(wèn)的.h文件導(dǎo)入到系統(tǒng)推薦的.h文件中未桥。

第三部、真機(jī)芥备,模擬器編譯一下冬耿。就可以生成.a文件(必須先用真機(jī),要不然萌壳,不能生成)亦镶。


第四步、Xcode生成的.a文件默認(rèn)沒(méi)有導(dǎo)出.h文件讶凉。需要自己添加染乌。

第五步、導(dǎo)出你自己的靜態(tài)庫(kù)的配置



注意:如果第五步中懂讯,不降Build Configuration改為Release荷憋,則打包出來(lái)的靜態(tài)庫(kù)會(huì)存于【Debug-iPhoneos】和【Debug-iphonesimulator】?jī)蓚€(gè)文件夾下。我們一般都是使用Release模式褐望,因?yàn)槌绦蜃罱K會(huì)發(fā)布之后是Release版的勒庄,所以靜態(tài)庫(kù)也是在Release模式下使用。

第六步瘫里、合成模擬器的架構(gòu)【默認(rèn):模擬器只會(huì)生成對(duì)應(yīng)的1種架構(gòu)】


如果第六步這里实蔽,設(shè)置為YES,那么編譯出來(lái)的.a文件庫(kù)就只包含當(dāng)前設(shè)備的架構(gòu)谨读。

第七步局装、合并架構(gòu)【真機(jī)和模擬器】
真機(jī)和模擬器合并:

lipo -create 靜態(tài)庫(kù)1.a(路徑) 靜態(tài)庫(kù)2.a(路徑) -output 靜態(tài)庫(kù).a (你最好cd到工程目錄下,這樣導(dǎo)出的文件在你工程目錄下)

第八步、資源包的問(wèn)題

1铐尚、靜態(tài)庫(kù)的資源拨脉,都應(yīng)該放到后綴為.bundle的文件夾中-->避免文件與本地文件重名被覆蓋,導(dǎo)致加載資源文件出錯(cuò)宣增∶蛋颍【注:要加載bundle路徑】
2、靜態(tài)庫(kù)打包時(shí)爹脾,并不會(huì)打包資源文件 --> 需要手動(dòng)拖進(jìn)去

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帖旨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灵妨,更是在濱河造成了極大的恐慌解阅,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷串,死亡現(xiàn)場(chǎng)離奇詭異瓮钥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烹吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)碉熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肋拔,你說(shuō)我怎么就攤上這事锈津。” “怎么了凉蜂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵琼梆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我窿吩,道長(zhǎng)茎杂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任纫雁,我火速辦了婚禮煌往,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轧邪。我一直安慰自己刽脖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布忌愚。 她就那樣靜靜地躺著曲管,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硕糊。 梳的紋絲不亂的頭發(fā)上院水,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天腊徙,我揣著相機(jī)與錄音,去河邊找鬼衙耕。 笑死昧穿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橙喘。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胶逢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厅瞎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起初坠,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤和簸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后碟刺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锁保,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年半沽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽柒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡者填,死狀恐怖浩村,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情占哟,我是刑警寧澤心墅,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站榨乎,受9級(jí)特大地震影響怎燥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜜暑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一铐姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧史煎,春花似錦谦屑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至恬偷,卻和暖如春悍手,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工坦康, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竣付,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓滞欠,卻偏偏與公主長(zhǎng)得像古胆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筛璧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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