ios開(kāi)發(fā)中經(jīng)常會(huì)依賴framework和.a文件,這兩種文件有什么區(qū)別呢钥组?今天就聊聊這兩種文件格式。
動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)
在說(shuō)framework和.a文件之前,先明確一下什么是靜態(tài)庫(kù)匾乓,什么是動(dòng)態(tài)庫(kù)。
靜態(tài)庫(kù)
靜態(tài)庫(kù)即靜態(tài)鏈接庫(kù)又谋。靜態(tài)庫(kù)在編譯的時(shí)候會(huì)被直接拷貝一份拼缝,復(fù)制到目標(biāo)程序里,這段代碼在目標(biāo)程序里就相當(dāng)于寫(xiě)死了彰亥,不會(huì)發(fā)生什么改變了咧七。
- 好處就是方便,放在工程中就能用任斋,編譯完成后继阻,跟這個(gè)庫(kù)文件就沒(méi)什么關(guān)系了。
- 缺點(diǎn)就是目標(biāo)程序會(huì)增大废酷,拷貝了一份程序進(jìn)去瘟檩,能不增大嗎。
動(dòng)態(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)來(lái)丰介。
- 優(yōu)點(diǎn)是背蟆,不需要拷貝到目標(biāo)程序中,不會(huì)影響目標(biāo)程序的體積哮幢,而且同一份庫(kù)可以被多個(gè)程序使用带膀。同時(shí),隨時(shí)對(duì)庫(kù)進(jìn)行替換橙垢,而不需要重新編譯代碼垛叨。
- 缺點(diǎn)是比較麻煩,經(jīng)常由于外因?qū)е轮赶虿徽_柜某,而出現(xiàn)錯(cuò)誤嗽元。同時(shí)也會(huì)造成一部分性能的損失。
framework與.a
framework
framework可以將庫(kù)的二進(jìn)制文件喂击,頭文件和有關(guān)的資源文件打包到一起剂癌,方便管理和分發(fā)。這個(gè)有點(diǎn)類似于Android的aar翰绊。
那framework屬于靜態(tài)庫(kù)呢還是動(dòng)態(tài)庫(kù)呢佩谷,這個(gè)應(yīng)該是都有的旁壮。系統(tǒng)提供的framework就是動(dòng)態(tài)的,比如UIKit.Framework谐檀。但是自己做的一般都是靜態(tài)的抡谐,方便使用。
.a
.a是一個(gè)純二進(jìn)制文件桐猬,有點(diǎn)像Android的jar麦撵,不能包含資源文件,而且.a文件不能直接使用需要有頭文件配合溃肪,這個(gè)很好理解厦坛,C開(kāi)發(fā)嘛,當(dāng)然需要頭文件乍惊,.a不能包含頭文件杜秸,所以需要手動(dòng)加入頭文件,所以這種方式是比較麻煩的润绎。
如何打包
framework
現(xiàn)在可以試著做一個(gè)framework
點(diǎn)擊這個(gè)按鈕
然后創(chuàng)建工程撬碟,如下圖所示:
修改一些配置信息,生成支持所有架構(gòu)的版本莉撇。
新建一對(duì)文件呢蛤,隨便寫(xiě)點(diǎn)東西:
配置可以暴露的文件,一般來(lái)說(shuō)頭文件需要暴露棍郎,這個(gè)有點(diǎn)類似于Android的混淆機(jī)制
然后編譯即可其障,注意編譯的時(shí)候選擇模擬器或者Generic iOS Device
編譯成功后,Products下的framework會(huì)由紅色變成黑色涂佃,就可以使用了:
但是查看文件夾的時(shí)候你會(huì)發(fā)現(xiàn)励翼,實(shí)際生成了兩個(gè)framework:
一個(gè)是針對(duì)模擬器的一個(gè)是針對(duì)真機(jī)的。
如果你想要一個(gè)通用版怎么辦呢辜荠?用命令行的方式解決吧汽抚!
在工程中,右鍵選擇生成的framework伯病,選擇show in finder:
找到這個(gè)文件 然后進(jìn)入終端:
輸入
lipo -create
然后將上圖中的那個(gè)文件拖進(jìn)去造烁,這個(gè)文件應(yīng)該有兩個(gè),一個(gè)模擬器的一個(gè)真機(jī)的午笛。然后在上-output 加上輸出路徑惭蟋,如下圖所示:
這樣就會(huì)在文件夾下生成一個(gè).lipo文件(原諒我上圖中名字拼錯(cuò)了,哈哈)
然后將生成的文件替換之前模擬器或者真機(jī)中framework對(duì)應(yīng)的文件药磺,注意改名告组,保持一致:
然后這個(gè)framework就可以用了。
.a
前面說(shuō)了与涡,我們可以將.m文件封裝成.a,加上.h文件惹谐,也可以成為靜態(tài)庫(kù)文件。
這次選擇這個(gè):
然后隨便寫(xiě)點(diǎn)東西:
然后點(diǎn)擊運(yùn)行(注意跟上面一樣驼卖,一定要分別對(duì)模擬器和真機(jī)點(diǎn)擊運(yùn)行各一次)氨肌,這樣就生成了.a文件:
這個(gè)跟上面一樣,也會(huì)生成一個(gè)模擬器的.a文件酌畜,一個(gè)真機(jī)的.a文件怎囚。
還是用上面的命令
lipo -create
就可以合成通用的.a文件。
總結(jié)
與IOS庫(kù)相關(guān)的概念就介紹到這里桥胞。這篇文章代碼較少恳守,主要是用圖片對(duì)概念和方法進(jìn)行了介紹,希望能幫到初入IOS的同學(xué)贩虾。