iOS開發(fā)過程中經(jīng)常會(huì)用到第三方庫晤斩,微信支付,支付寶支付姆坚,地圖尸昧,即時(shí)通信的庫,極大的提升了開發(fā)效率旷偿,如果公司項(xiàng)目比較大烹俗,也可以將常用的業(yè)務(wù)模塊封裝成庫供內(nèi)部使用.
基礎(chǔ)概念
庫作為共享程序的形式,分為靜態(tài)庫和動(dòng)態(tài)庫.
靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中萍程,被多次使用就有多份冗余拷貝.文件后綴名為.a和.frameWork
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制幢妄,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用茫负,系統(tǒng)只加載一次蕉鸳,多個(gè)程序共用,節(jié)省內(nèi)存. 文件后綴名為.dylib和.framework
FrameWork比較特殊可以是靜態(tài)庫也可以是動(dòng)態(tài)庫忍法,系統(tǒng)的UIKit.frameWork是動(dòng)態(tài)庫潮尝,自己建立的或者第三方的.frameWork為靜態(tài)庫.
靜態(tài)庫.a是一個(gè)二進(jìn)制文件,無法直接提供給外界使用饿序,需要提供一個(gè).h文件供外部調(diào)用勉失,微信支付的提供了.a和.h文件.
靜態(tài)庫frameWork與.a最大不同的在于,資源文件和.h文件原探,例如即時(shí)通信的庫文件一般為.frameWork因?yàn)閮?nèi)部需要提供給聊天的默認(rèn)圖片乱凿,Gif等資源文件,.frameWork在開發(fā)中更常見一些.
iOS8 & Swift
iOS 8 之前不支持動(dòng)態(tài)FrameWork咽弦,iOS 8 之后添加了動(dòng)態(tài)庫的支持徒蟆,主要原因是Extension 和 App 作為兩個(gè)分開的可執(zhí)行文件,同時(shí)需要共享代碼型型,這種情況下動(dòng)態(tài)庫的支持就是必不可少的了.但是這種動(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ā)布的嫂用,如果要在項(xiàng)目中使用外部的代碼型凳,可選的方式只有兩種,一種是把代碼拷貝到工程中嘱函,另一種是用動(dòng)態(tài) Framework.使用靜態(tài)庫是不支持的.
造成這個(gè)問題的原因主要是 Swift 的運(yùn)行庫沒有被包含在 iOS 系統(tǒng)中甘畅,而是會(huì)打包進(jìn) App 中(這也是造成 Swift App 體積大的原因),靜態(tài)庫會(huì)導(dǎo)致最終的目標(biāo)程序中包含重復(fù)的運(yùn)行庫.同時(shí)拷貝 Runtime 這種做法也會(huì)導(dǎo)致在純 ObjC 的項(xiàng)目中使用 Swift 庫出現(xiàn)問題往弓。蘋果聲稱等到 Swift 的 Runtime 穩(wěn)定之后會(huì)被加入到系統(tǒng)當(dāng)中疏唾,到時(shí)候這個(gè)限制就會(huì)被去除了.