一、什么是庫(framework)
庫是程序代碼的集合,是程序開發(fā)者與其他開發(fā)者之間進(jìn)行代碼共享的一種方式。
庫根據(jù)源代碼公開的情況可以:
- 開源庫
- 開源庫的源代碼可見,比如afnetworking。
- 閉源庫
- 閉源庫的源代碼不可見,是一段編譯好的二進(jìn)制代碼
閉源庫有根據(jù)相對編譯時(shí)和運(yùn)行時(shí):
- 靜態(tài)庫
- 動態(tài)庫
二、靜態(tài)庫和動態(tài)庫區(qū)別
1、格式上的區(qū)別:
靜態(tài)庫的格式:
- .a
- .framework
動態(tài)庫的格式:
- .dylib
- .framework
但是系統(tǒng)的.framework都是動態(tài)庫
2、時(shí)間上區(qū)別
靜態(tài)庫:
- 編譯時(shí)會被拷貝到可執(zhí)行文件中
動態(tài)庫:
- 運(yùn)行時(shí)由系統(tǒng)加載到內(nèi)存
3、使用上的區(qū)別:
靜態(tài)庫使用:
- 在編譯時(shí)會被拷貝到可執(zhí)行文件中,使用多次就會被多次拷貝。
優(yōu)勢:
- 編譯完成之后,這個(gè)靜態(tài)庫也就沒有什么作用了。
劣勢:
- 增加了可執(zhí)行文件的體積
動態(tài)庫使用:
- 在運(yùn)行時(shí)由系統(tǒng)加載到內(nèi)存,相同的動態(tài)庫只加載一次,供多個(gè)程序調(diào)用,節(jié)省內(nèi)存。
在iOS8之前,自定義的動態(tài)庫是不允許使用的。但是iOS8中,隨著extension的出現(xiàn),動態(tài)庫才開始有用武之地。
三、怎么區(qū)分動態(tài)庫和靜態(tài)庫
因?yàn)?a肯定是靜態(tài)庫,.dylib肯定是動態(tài)庫,所以區(qū)分主要針對.feamework形式
1、通過命令行指令進(jìn)行區(qū)分
- cd xx.framework
- file xx
xx為.framwork下的二進(jìn)制文件
- 判斷:靜態(tài)庫包含“current ar archive random library”字樣. 動態(tài)庫包含“dynamically linked shared library”字樣
2、根據(jù)是否是系統(tǒng)的.framework
一般情況下:
系統(tǒng)的.framework都是動態(tài)庫
非系統(tǒng)的都是.framework都是靜態(tài)庫