iOS動態(tài)庫,靜態(tài)庫以及framework

注:文章轉(zhuǎn)自他處铃将,原文地址:https://skyline75489.github.io/post/2015-8-14_ios_static_dynamic_framework_learning.htm

1.什么是庫闽晦?

庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別人使用光酣。

還有,庫是共享程序代碼的方式,一般分為靜態(tài)庫和動態(tài)庫昂灵。

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

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


2.iOS里靜態(tài)庫形式

.a和.framework

3.iOS里動態(tài)庫形式乘客?

.dylib和.framework


4.framework為什么既是靜態(tài)庫又是動態(tài)庫狐血?

系統(tǒng)的.framework是動態(tài)庫,我們自己建立的.framework是靜態(tài)庫易核。

5.a與.framework有什么區(qū)別匈织?

.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件牡直。

.a文件不能直接使用缀匕,至少要有.h文件配合,.framework文件可以直接使用碰逸。

.a+.h+sourceFile =.framework乡小。

建議用.framework.


6.什么場景下使用庫?

(1).某些代碼需要給別人使用花竞,但是我們不希望別人看到源碼劲件,就需要以庫的形式進行封裝,只暴露出頭文件约急。

(2).對于某些不會進行大的改動的代碼,我們想減少編譯的時間苗分,就可以把它打包成庫厌蔽,因為庫是已經(jīng)編譯好的二進制了,

編譯的時候只需要 Link 一下摔癣,不會浪費編譯時間奴饮。

上面提到的庫在使用的時候需要 Link纬向,Link 的方式有兩種,靜態(tài)和動態(tài)戴卜,于是便產(chǎn)生了靜態(tài)庫和動態(tài)庫逾条。


7.靜態(tài)庫

7.1靜態(tài)庫的介紹

靜態(tài)庫即靜態(tài)鏈接庫(Windows 下的 .lib,Linux 和 Mac 下的 .a)投剥。之所以叫做靜態(tài)师脂,是因為靜態(tài)庫在編譯的時候會被直接拷貝一份,復(fù)制到目標(biāo)程序里江锨,這段代碼在目標(biāo)程序里就不會再改變了吃警。

靜態(tài)庫的好處很明顯,編譯完成之后啄育,庫文件實際上就沒有作用了酌心。目標(biāo)程序沒有外部依賴,直接就可以運行挑豌。當(dāng)然其缺點也很明顯安券,就是會使用目標(biāo)程序的體積增大。

7.2為什么要使用靜態(tài)庫氓英?

方便共享代碼侯勉,便于合理使用。

實現(xiàn)iOS程序的模塊化债蓝】呛祝可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫。

和別人分享你的代碼庫饰迹,但不想讓別人看到你代碼的實現(xiàn)芳誓。

開發(fā)第三方sdk的需要。

7.3制作靜態(tài)庫時的幾點注意

1 注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫啊鸭,我們需要的都是二進制文件+.h+其它資源文件的形式锹淌,不同的是,.a本身就是二進制文件赠制,需要我們自己配上.h和其它文件才能使用赂摆,而.framework本身已經(jīng)包含了.h和其它文件,可以直接使用钟些。

2 圖片資源的處理:兩種靜態(tài)庫烟号,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同政恍。.bundle文件很好弄汪拥,新建一個文件夾,把它改名為.bundle就可以了篙耗,右鍵迫筑,顯示包內(nèi)容可以向其中添加圖片資源宪赶。

3 category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的脯燃,但是在用這個靜態(tài)庫的工程中搂妻,調(diào)用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC辕棚。

4 如果一個靜態(tài)庫很復(fù)雜欲主,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同)坟募,然后把所有需要暴露出來的.h文件都集中放在這個.h文件中岛蚤,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了懈糯。

5.注意:動態(tài)庫可以使用但是不能上架涤妒!

而且使用的時候必須在添加動態(tài)庫的工程中的 General-->Embedded Binaries 中添加一下,具體如圖所示:


那么如何想使用動態(tài)庫上架呢赚哗?我們只需要在制作的時候?qū)⑵渚幾g成靜態(tài)庫她紫。在Buid Settins-->Mach-O Type--> Static Library具體如圖:


動態(tài)轉(zhuǎn)靜態(tài)

同樣不要忘了編譯,這樣編譯出來的庫就是靜態(tài)庫了屿储。我們就可以像靜態(tài)庫一樣在工程中使用了贿讹。


8.動態(tài)庫

8.1 什么是動態(tài)庫

動態(tài)庫即動態(tài)鏈接庫(Windows 下的 .dll,Linux 下的 .so够掠,Mac 下的 .dylib/.tbd)民褂。與靜態(tài)庫相反,動態(tài)庫在編譯時并不會被拷貝到目標(biāo)程序中疯潭,目標(biāo)程序中只會存儲指向動態(tài)庫的引用赊堪。等到程序運行時,動態(tài)庫才會被真正加載進來竖哩。

8.2動態(tài)庫的優(yōu)缺點

不需要拷貝到目標(biāo)程序中哭廉,不會影響目標(biāo)程序的體積,而且同一份庫可以被多個程序使用(因為這個原因相叁,動態(tài)庫也被稱作共享庫)遵绰。同時,編譯時才載入的特性增淹,也可以讓我們隨時對庫進行替換椿访,而不需要重新編譯代碼。動態(tài)庫帶來的問題主要是虑润,動態(tài)載入會帶來一部分性能損失赎离,使用動態(tài)庫也會使得程序依賴于外部環(huán)境。如果環(huán)境缺少動態(tài)庫或者庫的版本不正確端辱,就會導(dǎo)致程序無法運行(Linux 下喜聞樂見的 lib not found 錯誤)梁剔。


9.iOS Framework

9.1什么是framework

除了上面提到的 .a 和 .dylib/.tbd 之外,Mac OS/iOS 平臺還可以使用 Framework舞蔽。

Framework :實際上是一種打包方式荣病,將庫的二進制文件,頭文件和有關(guān)的資源文件打包到一起渗柿,方便管理和分發(fā)个盆。

framework是Cocoa/Cocoa Touch程序中使用的一種資源打包方式,可以將將代碼文件朵栖、頭文件颊亮、資源文件、說明文檔等集中在一起陨溅,方便開發(fā)者使用终惑。

Cocoa/Cocoa Touch開發(fā)框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等门扇。需要注意的是雹有,這些framework無一例外都是動態(tài)庫。

平時我們用的第三方SDK的framework都是靜態(tài)庫臼寄,真正的動態(tài)庫是上不了AppStore的霸奕。

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

系統(tǒng)的.framework是動態(tài)庫吉拳,我們自己建立的.framework是靜態(tài)庫质帅。

9.3framework背景介紹

(1).在 iOS 8 之前,iOS 平臺不支持使用動態(tài) Framework留攒,開發(fā)者可以使用的 Framework 只有蘋果自家的 UIKit.Framework煤惩,F(xiàn)oundation.Framework 等。

?(2) ?.iOS 8/Xcode 6 推出之后稼跳,iOS 平臺添加了動態(tài)庫的支持盟庞,同時 Xcode 6 也原生自帶了 Framework 支持(動態(tài)和靜態(tài)都可以)。

為什么 iOS 8 要添加動態(tài)庫的支持汤善?唯一的理由大概就是 Extension 的出現(xiàn)什猖。Extension 和 App 是兩個分開的可執(zhí)行文件,同時需要共享代碼红淡,這種情況下動態(tài)庫的支持就是必不可少的了不狮。但是這種動態(tài) Framework 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別。系統(tǒng)的 Framework 不需要拷貝到目標(biāo)程序中在旱,我們自己做出來的 Framework 哪怕是動態(tài)的摇零,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的),因此蘋果又把這種 Framework 稱為Embedded Framework桶蝎。


10. CocoaPods 的做法

在純 ObjC 的項目中驻仅,CocoaPods 使用編譯靜態(tài)庫 .a 方法將代碼集成到項目中谅畅。在 Pods 項目中的每個 target 都對應(yīng)這一個 Pod 的靜態(tài)庫。不過在編譯過程中并不會真的產(chǎn)出 .a 文件噪服。如果需要 .a 文件的話毡泻,可以參考這里,或者使用CocoasPods-Packager這個插件粘优。

當(dāng)不想發(fā)布代碼的時候仇味,也可以使用 Framework 發(fā)布 Pod,CocoaPods 提供了vendored_framework

選項來使用第三方 Framework雹顺,具體的做法可以參考這里1這里2丹墨。

對于 Swift 項目,CocoaPods 提供了動態(tài) Framework 的支持嬉愧,通過 use_frameworks!


[更多參考資料]

WWDC2014之iOS使用動態(tài)庫中有很詳細(xì)的創(chuàng)建動態(tài)庫和使用動態(tài)庫的教程贩挣。

博客:http://geeklu.com/2014/02/objc-lib/

https://stackoverflow.com/questions/2649334/difference-between-static-and-shared-libraries

https://stackoverflow.com/questions/25080914/will-ios-8-support-dynamic-linking

https://stackoverflow.com/questions/6245761/difference-between-framework-and-static-library-in-xcode4-and-how-to-call-them http://blog.cocoapods.org/CocoaPods-0.36/ 文/千_城(簡書作者) 原文鏈接:http://www.reibang.com/p/02b7032344d7

IOSOpenDev越獄開發(fā)環(huán)境配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市英染,隨后出現(xiàn)的幾起案子揽惹,更是在濱河造成了極大的恐慌,老刑警劉巖四康,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搪搏,死亡現(xiàn)場離奇詭異,居然都是意外死亡闪金,警方通過查閱死者的電腦和手機疯溺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哎垦,“玉大人囱嫩,你說我怎么就攤上這事÷┥瑁” “怎么了墨闲?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郑口。 經(jīng)常有香客問我鸳碧,道長,這世上最難降的妖魔是什么犬性? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任瞻离,我火速辦了婚禮,結(jié)果婚禮上乒裆,老公的妹妹穿的比我還像新娘套利。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布肉迫。 她就那樣靜靜地躺著验辞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昂拂。 梳的紋絲不亂的頭發(fā)上受神,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音格侯,去河邊找鬼。 笑死财著,一個胖子當(dāng)著我的面吹牛联四,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撑教,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼朝墩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伟姐?” 一聲冷哼從身側(cè)響起收苏,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愤兵,沒想到半個月后鹿霸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡秆乳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年懦鼠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹堰。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡肛冶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扯键,到底是詐尸還是另有隱情睦袖,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布荣刑,位于F島的核電站馅笙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘶摊。R本人自食惡果不足惜延蟹,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叶堆。 院中可真熱鬧阱飘,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至高帖,卻和暖如春缰儿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背散址。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工乖阵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人预麸。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓瞪浸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吏祸。 傳聞我的和親對象是個殘疾皇子对蒲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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