iOS - 靜態(tài)庫(kù)撮弧、動(dòng)態(tài)庫(kù)饲做、Framework

背景: 在項(xiàng)目中使用OC和Swift混編, 用Cocoapods導(dǎo)入SwiftyJSON時(shí)需要在PodFile里面使用use_frameworks!才能安裝, 導(dǎo)入成功后編譯項(xiàng)目報(bào).h 未能發(fā)現(xiàn)的錯(cuò)誤. 經(jīng)過一頓google之后得知如果在cocoapods 里面不使用 use_frameworks!, 則是通過static libraries 這個(gè)方式來管理pod的代碼. 而如果使用了use_frameworks!, 則cocoapods 使用frameworks 來取代static libraries 方式. 所以這就引出了靜態(tài)庫(kù)和Framework這兩個(gè)概念, 然后干脆就查了一下靜態(tài)庫(kù), 動(dòng)態(tài)庫(kù),Framework的概念.

靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別

首先來看什么是庫(kù),庫(kù)(Library)說白了就是一段編譯好的二進(jìn)制代碼狼电,加上頭文件就可以供別人使用蜒灰。
什么時(shí)候我們會(huì)用到庫(kù)呢?一種情況是某些代碼需要給別人使用肩碟,但是我們不希望別人看到源碼强窖,就需要以庫(kù)的形式進(jìn)行封裝,只暴露出頭文件削祈。另外一種情況是翅溺,對(duì)于某些不會(huì)進(jìn)行大的改動(dòng)的代碼,我們想減少編譯的時(shí)間髓抑,就可以把它打包成庫(kù)咙崎,因?yàn)閹?kù)是已經(jīng)編譯好的二進(jìn)制了,編譯的時(shí)候只需要 Link 一下吨拍,不會(huì)浪費(fèi)編譯時(shí)間褪猛。
上面提到庫(kù)在使用的時(shí)候需要 Link,Link 的方式有兩種羹饰,靜態(tài)和動(dòng)態(tài)伊滋,于是便產(chǎn)生了靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。


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

靜態(tài)庫(kù)即靜態(tài)鏈接庫(kù)(Windows 下的 .lib队秩,Linux 和 Mac 下的 .a)笑旺。之所以叫做靜態(tài),是因?yàn)殪o態(tài)庫(kù)在編譯的時(shí)候會(huì)被直接拷貝一份馍资,復(fù)制到目標(biāo)程序里筒主,這段代碼在目標(biāo)程序里就不會(huì)再改變了。
靜態(tài)庫(kù)的好處很明顯鸟蟹,編譯完成之后物舒,庫(kù)文件實(shí)際上就沒有作用了。目標(biāo)程序沒有外部依賴戏锹,直接就可以運(yùn)行。當(dāng)然其缺點(diǎn)也很明顯火诸,就是會(huì)使用目標(biāo)程序的體積增大锦针。

動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)即動(dòng)態(tài)鏈接庫(kù)(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib/.tbd)奈搜。與靜態(tài)庫(kù)相反悉盆,動(dòng)態(tài)庫(kù)在編譯時(shí)并不會(huì)被拷貝到目標(biāo)程序中,目標(biāo)程序中只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫(kù)的引用馋吗。等到程序運(yùn)行時(shí)焕盟,動(dòng)態(tài)庫(kù)才會(huì)被真正加載進(jìn)來。
動(dòng)態(tài)庫(kù)的優(yōu)點(diǎn)是宏粤,不需要拷貝到目標(biāo)程序中脚翘,不會(huì)影響目標(biāo)程序的體積,而且同一份庫(kù)可以被多個(gè)程序使用(因?yàn)檫@個(gè)原因绍哎,動(dòng)態(tài)庫(kù)也被稱作共享庫(kù))来农。同時(shí),編譯時(shí)才載入的特性崇堰,也可以讓我們隨時(shí)對(duì)庫(kù)進(jìn)行替換沃于,而不需要重新編譯代碼。動(dòng)態(tài)庫(kù)帶來的問題主要是海诲,動(dòng)態(tài)載入會(huì)帶來一部分性能損失繁莹,使用動(dòng)態(tài)庫(kù)也會(huì)使得程序依賴于外部環(huán)境。如果環(huán)境缺少動(dòng)態(tài)庫(kù)或者庫(kù)的版本不正確特幔,就會(huì)導(dǎo)致程序無法運(yùn)行(Linux 下喜聞樂見的 lib not found 錯(cuò)誤)咨演。

iOS Framework

除了上面提到的 .a 和 .dylib/.tbd 之外,Mac OS/iOS 平臺(tái)還可以使用 Framework敬辣。Framework 實(shí)際上是一種打包方式雪标,將庫(kù)的二進(jìn)制文件,頭文件和有關(guān)的資源文件打包到一起溉跃,方便管理和分發(fā)村刨。
在 iOS 8 之前,iOS 平臺(tái)不支持使用動(dòng)態(tài) Framework撰茎,開發(fā)者可以使用的 Framework 只有蘋果自家的 UIKit.Framework嵌牺,F(xiàn)oundation.Framework 等。這種限制可能是出于安全的考慮龄糊。換一個(gè)角度講逆粹,因?yàn)?iOS 應(yīng)用都是運(yùn)行在沙盒當(dāng)中,不同的程序之間不能共享代碼炫惩,同時(shí)動(dòng)態(tài)下載代碼又是被蘋果明令禁止的僻弹,沒辦法發(fā)揮出動(dòng)態(tài)庫(kù)的優(yōu)勢(shì),實(shí)際上動(dòng)態(tài)庫(kù)也就沒有存在的必要了他嚷。
由于上面提到的限制蹋绽,開發(fā)者想要在 iOS 平臺(tái)共享代碼芭毙,唯一的選擇就是打包成靜態(tài)庫(kù) .a 文件,同時(shí)附上頭文件(例如微信的SDK)卸耘。但是這樣的打包方式不夠方便退敦,使用時(shí)也比較麻煩,大家還是希望共享代碼都能能像 Framework 一樣蚣抗,直接扔到工程里就可以用侈百。于是人們想出了各種奇技淫巧去讓 Xcode Build 出 iOS 可以使用的 Framework,這種方法產(chǎn)生的 Framework 還有 “偽”(Fake) Framework 和 “真”(Real) Framework 的區(qū)別翰铡。
iOS 8/Xcode 6 推出之后钝域,iOS 平臺(tái)添加了動(dòng)態(tài)庫(kù)的支持,同時(shí) Xcode 6 也原生自帶了 Framework 支持(動(dòng)態(tài)和靜態(tài)都可以)两蟀,上面提到的的奇技淫巧也就沒有必要了网梢。為什么 iOS 8 要添加動(dòng)態(tài)庫(kù)的支持?唯一的理由大概就是 Extension 的出現(xiàn)赂毯。Extension 和 App 是兩個(gè)分開的可執(zhí)行文件战虏,同時(shí)需要共享代碼,這種情況下動(dòng)態(tài)庫(kù)的支持就是必不可少的了党涕。但是這種動(dòng)態(tài) Framework 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別烦感。系統(tǒng)的 Framework 不需要拷貝到目標(biāo)程序中,我們自己做出來的 Framework 哪怕是動(dòng)態(tài)的膛堤,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的)手趣,因此蘋果又把這種 Framework 稱為 Embedded Framework。

Swift 支持

跟著 iOS8 / Xcode 6 同時(shí)發(fā)布的還有 Swift肥荔。如果要在項(xiàng)目中使用外部的代碼绿渣,可選的方式只有兩種,一種是把代碼拷貝到工程中燕耿,另一種是用動(dòng)態(tài) Framework中符。使用靜態(tài)庫(kù)是不支持的。
造成這個(gè)問題的原因主要是 Swift 的運(yùn)行庫(kù)沒有被包含在 iOS 系統(tǒng)中誉帅,而是會(huì)打包進(jìn) App 中(這也是造成 Swift App 體積大的原因)淀散,靜態(tài)庫(kù)會(huì)導(dǎo)致最終的目標(biāo)程序中包含重復(fù)的運(yùn)行庫(kù)(這是蘋果自家的解釋)。同時(shí)拷貝 Runtime 這種做法也會(huì)導(dǎo)致在純 ObjC 的項(xiàng)目中使用 Swift 庫(kù)出現(xiàn)問題蚜锨。蘋果聲稱等到 Swift 的 Runtime 穩(wěn)定之后會(huì)被加入到系統(tǒng)當(dāng)中档插,到時(shí)候這個(gè)限制就會(huì)被去除了。

CocoaPods 的做法

在純 ObjC 的項(xiàng)目中亚再,CocoaPods 使用編譯靜態(tài)庫(kù) .a 方法將代碼集成到項(xiàng)目中郭膛。在 Pods 項(xiàng)目中的每個(gè) target 都對(duì)應(yīng)這一個(gè) Pod 的靜態(tài)庫(kù)。不過在編譯過程中并不會(huì)真的產(chǎn)出 .a 文件
當(dāng)不想發(fā)布代碼的時(shí)候氛悬,也可以使用 Framework 發(fā)布 Pod饲鄙,CocoaPods 提供了vendored_framework 選項(xiàng)來使用第三方 Framework
對(duì)于 Swift 項(xiàng)目凄诞,CocoaPods 提供了動(dòng)態(tài) Framework 的支持,通過 use_frameworks!選項(xiàng)控制


參考1: iOS 靜態(tài)庫(kù)忍级,動(dòng)態(tài)庫(kù)與 Framework 淺析
參考2:博客(可能需要翻墻看)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伪朽,隨后出現(xiàn)的幾起案子轴咱,更是在濱河造成了極大的恐慌,老刑警劉巖烈涮,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴肺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坚洽,警方通過查閱死者的電腦和手機(jī)戈稿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讶舰,“玉大人鞍盗,你說我怎么就攤上這事√纾” “怎么了般甲?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鹅颊。 經(jīng)常有香客問我敷存,道長(zhǎng),這世上最難降的妖魔是什么堪伍? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任锚烦,我火速辦了婚禮,結(jié)果婚禮上帝雇,老公的妹妹穿的比我還像新娘涮俄。我一直安慰自己,他們只是感情好摊求,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布禽拔。 她就那樣靜靜地躺著,像睡著了一般室叉。 火紅的嫁衣襯著肌膚如雪睹栖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天茧痕,我揣著相機(jī)與錄音野来,去河邊找鬼。 笑死踪旷,一個(gè)胖子當(dāng)著我的面吹牛曼氛,可吹牛的內(nèi)容都是我干的豁辉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舀患,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼徽级!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起聊浅,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤餐抢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后低匙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旷痕,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年顽冶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欺抗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡强重,死狀恐怖绞呈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竿屹,我是刑警寧澤报强,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站拱燃,受9級(jí)特大地震影響秉溉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碗誉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一召嘶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哮缺,春花似錦弄跌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糠溜,卻和暖如春淳玩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背非竿。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蜕着, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人红柱。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓承匣,卻偏偏與公主長(zhǎng)得像蓖乘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子韧骗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別 首先來看什么是庫(kù)袍暴,庫(kù)(Library)說白了就是一段編譯好的二進(jìn)制代碼众眨,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,962評(píng)論 3 42
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件容诬、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,118評(píng)論 4 61
  • 入睡時(shí)間:22:00 起床時(shí)間:06:00 【每日一思】 盡管其他人反對(duì),我自己仍堅(jiān)持己見在做的事情有哪些沿腰? 說到...
    雲(yún)端生活美學(xué)閱讀 213評(píng)論 0 0
  • 2017年2月5日中央一號(hào)文件首次提到“田園綜合體”的概念览徒,指出:“建設(shè)以農(nóng)民合作社為主要載體、讓農(nóng)民充分參與和受...
    甲坤閱讀 1,159評(píng)論 0 0
  • 2014年9月13日迎新時(shí),我們第一次見面措嵌,而后來又因?yàn)閬y七八糟的事變得越來越熟躲叼,到最后在一起。從認(rèn)識(shí)到...
    蘇墨咪閱讀 439評(píng)論 0 1