iOS下靜態(tài)庫與動態(tài)庫概念

庫這一個概念由來已久,不是蘋果帶來的新東西。iOS平臺下對靜態(tài)庫和動態(tài)庫的使用又有一些不同。

一、先看一下庫的基本概念:

庫是共享程序代碼的方式,一般分為靜態(tài)庫和動態(tài)庫;庫實現(xiàn)了程序的模塊化,將某些特定的功能模塊化為庫的格式方便分享和使用!

1、那么靜態(tài)和動態(tài)有什么區(qū)別呢?

靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。

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

靜態(tài)庫和動態(tài)庫都是閉源庫,只能拿來滿足某個功能的使用,不會暴露內(nèi)部具體的代碼信息,而從github上下載的第三方庫大多是開源庫

二、iOS平臺下庫的不同與延伸:

1、靜態(tài)庫和動態(tài)庫的有兩種表現(xiàn)形式:

二進制庫:由源碼編譯成的二進制。靜態(tài)的.a結(jié)尾,動態(tài)的.dylib結(jié)尾

.framework: 我們一個庫的源碼編譯為二進制后,如果需要給其他人用,要將二進制+.h+資源文件(如果有)分發(fā)給其他人。也就是說只有二進制是不能用的。.framework其實就是一種打包形式,將二進制.h資源文件做成.framwork的形式來分發(fā),這樣其他用戶直接將.framework直接拖到項目里就可以用了。

我們所說的動態(tài)與靜態(tài)其實是指的二進制的動態(tài)與靜態(tài),.framework的靜動態(tài)之分也是指其內(nèi)包含的二進制的靜動態(tài)之分。

從以上可以看到.framework的分發(fā)方式要更方便,所以人們都希望通過.framework的形式來提供給其他人用。

2、iOS下動態(tài)靜態(tài)庫的特別之處

1、wwdc2014之前:

只支持靜態(tài)二進制

xcode只支持靜態(tài)二進制的制作,也即可以創(chuàng)建類型為 Static library的工程,然后將頭文件和資源文件一起分發(fā)給用戶。

xcode不支持創(chuàng)建framework創(chuàng)建的,只能自己手動創(chuàng)建偽framework來使用,也就是說仿照framework的目錄形式,將.h ,二進制,資源文件打包成.framework,通俗的來說就是將一個目錄形式符合framework的文件夾修改為.framework結(jié)尾,然后進行分發(fā)。

2、wwdc2014之后:

開始支持動態(tài)二進制 以及.framework的制作。(關(guān)于如何制作,這篇文章不涉及)

WWDC2014一個很大感觸是蘋果對iOS的開放態(tài)度:發(fā)布了Xcode6 beta和iOS8,iOS8上開放了允許使用動態(tài)庫、允許第三方鍵盤、App Extension等等。App Extension的出現(xiàn),可以為一個應(yīng)用創(chuàng)建插件,這樣主app和插件之間共享動態(tài)庫還是可行的。

注意:在iOS平臺下,自己制作的動態(tài)庫不能像系統(tǒng)提供的動態(tài)庫那樣在app之間動態(tài)鏈接,只能在自己app之內(nèi)使用,embed in app 中(即動態(tài)庫也會放到app 的bundle中)。

對于動態(tài)Framework,主app會用app的證書對引用的動態(tài)Framework進行簽名,然后放入到主bundle中,此時動態(tài)Framework和app的簽名證書是一樣的。app在加載動態(tài)Framework時,沙盒會對動態(tài)庫進行簽名驗證,驗證通過才可以加載。

對于上架的app,不能通過動態(tài)更新動態(tài)庫的方式來熱更新app,因為apple會對我們上傳的動態(tài)庫和app進行再簽名,此時的簽名不再是我們的證書簽名。我們通過服務(wù)器下載的新動態(tài)Framework不能通過沙盒簽名驗證(不能造出來和蘋果相同的簽名)。

對于企業(yè)版app,不經(jīng)過apple的再簽名,只要保證我們新更新的動態(tài)Framework簽名證書和我們的app簽名證書相同,就可以實現(xiàn)動態(tài)更新。實現(xiàn)可以參考?iOS 利用 Framework 進行動態(tài)更新

3、動態(tài)庫Framework如何使用呢?

1、制作完動態(tài)Framework后,將Framework拖進自己的app工程中。

xcode幾個相關(guān)的配置:1、Build Settings ->Runnable Search Paths :指定從什么位置加載動態(tài)Framework,默認(rèn)為@executable_path/Frameworks,即在app主bundle/Frameworks下。2、BuildPhases->Embeded Frameworks,添加動態(tài)Framework,destination指向動態(tài)Framework拷貝到目的位置,默認(rèn)為app主bundle/Frameworks下,不同選項對應(yīng)不同位置。(Executables在mainBundle根目錄下,還有其他選項)

2、Build Settings ->Runnable Search Paths 修改為 @executable_path/,BuildPhases->Embeded Frameworks添加Framework,并修改destination為Executables.

3、代碼中獲取資源的方式,

NSBundle *bundle = [NSBundle bundleForClass:[PodName class]];//這種方式可以獲得mainBundle下(包括子目錄下)包括指定class的bundle

[UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil]//從bundle中獲得指定的資源

4、為什么swift不能用靜態(tài)庫,只能用動態(tài)庫?

swift不再支持靜態(tài)庫,原因是Swift runtime 不在系統(tǒng)中,而是打包在各個app或者二進制中。所以如果要使用 Swift 靜態(tài)框架,由于 ABI 不兼容,所以我們將不得不在靜態(tài)包中再包含一次 runtime,產(chǎn)生重復(fù)問題,用swift寫的庫,必須通過動態(tài)鏈接。iOS 8才開放了動態(tài)庫的權(quán)限,這也就間接放棄了 iOS 7(自測結(jié)果動態(tài)Framework 如果不包括資源文件,是可以在7上用的,如果有資源會引用不到資源)。swift runtime作為動態(tài)庫放入app中,其他swift動態(tài)庫可以動態(tài)的引用。

swift動態(tài)庫會將用到的相關(guān)的動態(tài)庫引入app中,導(dǎo)致swift的app變大。

5、cocoapods對swift的支持?

swfit只能使用動態(tài)庫,在Podfile頂部加上”use_frameworks!“,會將pod依賴都打成動態(tài)Framework。(其實打成Framework不是cocoapods做的,cocoapods做的只是根據(jù)這個標(biāo)識符,創(chuàng)建Framework類型的target,并且設(shè)置mach-o類型為dynamic;如果不加這個標(biāo)識符,則會創(chuàng)建Static library類型的target,并且設(shè)置mach-o類型為Static。xcode會根據(jù)target的設(shè)置去構(gòu)建出product)。

6、小命令

file 二進制 :如果輸出包含“dynamically linked shared library”,則說明是動態(tài)的,反之是靜態(tài)的。

lipo -info 二進制 :可以查看改二進制支持的cpu架構(gòu)。

總結(jié):

對oc來說,動態(tài)庫和靜態(tài)庫都可以使用,動態(tài)庫在程序啟動的時候也都會加載,沒有發(fā)現(xiàn)懶加載的方式。對于extension功能來說,動態(tài)庫有優(yōu)勢,可以共用動態(tài)庫。對swift來說只能用動態(tài)庫。

其實動態(tài)庫和靜態(tài)庫也沒有多么復(fù)雜,文中沒有介紹庫的制作方法,大家可以參考其他文章,以后相應(yīng)文章也會寫。

參考文章:

靜態(tài)庫和動態(tài)庫詳解

Objective-C和Swift混編的一些經(jīng)驗

Name Mangling

iOS 靜態(tài)庫,動態(tài)庫與 Framework

Pod二進制化

iOS CocoaPods組件平滑二進制化解決方案

Umbrella Header在framework中的應(yīng)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,991評論 2 374

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

  • 靜態(tài)庫與動態(tài)庫的區(qū)別 首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,018評論 3 42
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗...
    190CM閱讀 4,253評論 0 4
  • 介紹 動態(tài)庫形式:.dylib和.framework 靜態(tài)庫形式:.a和.framework 動態(tài)庫和靜態(tài)庫的區(qū)別...
    齊滇大圣閱讀 46,289評論 18 251
  • 那日去參加一活動,一寶媽說她因孩子的人來瘋而一直心情不佳(倆家長帶孩子去超市,自己孩子拿了很多東西,但在互相爭著付...
    一水源閱讀 361評論 0 5
  • 今天是9.4號,是我偶像的生日 祝他生日快樂。希望有機會可以見到他 。 記得大二開學(xué)的今天,我在學(xué)校的大熒幕上播放...
    爾爾醉風(fēng)閱讀 907評論 0 1