ios開發(fā)中經(jīng)常會依賴framework和.a文件,這兩種文件有什么區(qū)別呢?今天就聊聊這兩種文件格式。
動態(tài)庫與靜態(tài)庫
在說framework和.a文件之前,先明確一下什么是靜態(tài)庫,什么是動態(tài)庫。
靜態(tài)庫
靜態(tài)庫即靜態(tài)鏈接庫。靜態(tài)庫在編譯的時(shí)候會被直接拷貝一份,復(fù)制到目標(biāo)程序里,這段代碼在目標(biāo)程序里就相當(dāng)于寫死了,不會發(fā)生什么改變了。
- 好處就是方便,放在工程中就能用,編譯完成后,跟這個(gè)庫文件就沒什么關(guān)系了。
- 缺點(diǎn)就是目標(biāo)程序會增大,拷貝了一份程序進(jìn)去,能不增大嗎。
動態(tài)庫
動態(tài)庫在編譯時(shí)并不會被拷貝到目標(biāo)程序中,目標(biāo)程序中只會存儲指向動態(tài)庫的引用。等到程序運(yùn)行時(shí),動態(tài)庫才會被真正加載進(jìn)來。
- 優(yōu)點(diǎn)是,不需要拷貝到目標(biāo)程序中,不會影響目標(biāo)程序的體積,而且同一份庫可以被多個(gè)程序使用。同時(shí),隨時(shí)對庫進(jìn)行替換,而不需要重新編譯代碼。
- 缺點(diǎn)是比較麻煩,經(jīng)常由于外因?qū)е轮赶虿徽_,而出現(xiàn)錯(cuò)誤。同時(shí)也會造成一部分性能的損失。
framework與.a
framework
framework可以將庫的二進(jìn)制文件,頭文件和有關(guān)的資源文件打包到一起,方便管理和分發(fā)。這個(gè)有點(diǎn)類似于Android的aar。
那framework屬于靜態(tài)庫呢還是動態(tài)庫呢,這個(gè)應(yīng)該是都有的。系統(tǒng)提供的framework就是動態(tài)的,比如UIKit.Framework。但是自己做的一般都是靜態(tài)的,方便使用。
.a
.a是一個(gè)純二進(jìn)制文件,有點(diǎn)像Android的jar,不能包含資源文件,而且.a文件不能直接使用需要有頭文件配合,這個(gè)很好理解,C開發(fā)嘛,當(dāng)然需要頭文件,.a不能包含頭文件,所以需要手動加入頭文件,所以這種方式是比較麻煩的。
如何打包
framework
現(xiàn)在可以試著做一個(gè)framework

點(diǎn)擊這個(gè)按鈕

然后創(chuàng)建工程,如下圖所示:

修改一些配置信息,生成支持所有架構(gòu)的版本。

新建一對文件,隨便寫點(diǎn)東西:

配置可以暴露的文件,一般來說頭文件需要暴露,這個(gè)有點(diǎn)類似于Android的混淆機(jī)制

然后編譯即可,注意編譯的時(shí)候選擇模擬器或者Generic iOS Device
編譯成功后,Products下的framework會由紅色變成黑色,就可以使用了:

但是查看文件夾的時(shí)候你會發(fā)現(xiàn),實(shí)際生成了兩個(gè)framework:

一個(gè)是針對模擬器的一個(gè)是針對真機(jī)的。
如果你想要一個(gè)通用版怎么辦呢?用命令行的方式解決吧!
在工程中,右鍵選擇生成的framework,選擇show in finder:

找到這個(gè)文件 然后進(jìn)入終端:
輸入
lipo -create 然后將上圖中的那個(gè)文件拖進(jìn)去,這個(gè)文件應(yīng)該有兩個(gè),一個(gè)模擬器的一個(gè)真機(jī)的。然后在上-output 加上輸出路徑,如下圖所示:

這樣就會在文件夾下生成一個(gè).lipo文件(原諒我上圖中名字拼錯(cuò)了,哈哈)
然后將生成的文件替換之前模擬器或者真機(jī)中framework對應(yīng)的文件,注意改名,保持一致:

然后這個(gè)framework就可以用了。
.a
前面說了,我們可以將.m文件封裝成.a,加上.h文件,也可以成為靜態(tài)庫文件。
這次選擇這個(gè):

然后隨便寫點(diǎn)東西:

然后點(diǎn)擊運(yùn)行(注意跟上面一樣,一定要分別對模擬器和真機(jī)點(diǎn)擊運(yùn)行各一次),這樣就生成了.a文件:

這個(gè)跟上面一樣,也會生成一個(gè)模擬器的.a文件,一個(gè)真機(jī)的.a文件。
還是用上面的命令
lipo -create就可以合成通用的.a文件。
總結(jié)
與IOS庫相關(guān)的概念就介紹到這里。這篇文章代碼較少,主要是用圖片對概念和方法進(jìn)行了介紹,希望能幫到初入IOS的同學(xué)。