1.庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進制格式,可以被載入內(nèi)存中執(zhí)行。
庫分:
靜態(tài)庫(.a和.framework)
動態(tài)庫(.dylib和.framework)
2.framework為什么即是動態(tài)庫又是靜態(tài)庫?
因為系統(tǒng)的framework是動態(tài)庫,我們自己建立的framework是靜態(tài)庫
.a與.framework的區(qū)別
.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件
.a文件不能自己使用,至少要和.h文件配合,.framework文件可以自己使用
.a + .h + soureFile = .framework
建議使用.framework
注意:項目中如果使用了自制的動態(tài)庫,不能被上傳到 AppStore
3.靜態(tài)庫和動態(tài)庫在使用上的區(qū)別
靜態(tài)庫:鏈接時,靜態(tài)庫會被完整地復制到可執(zhí)行文件中, 被多次使用就有多份冗余拷貝 (左圖所示)
動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存 (下圖所示)

4.為什么要使用靜態(tài)庫?
方便代碼的共享和重復利用,可以吧固定我業(yè)務模塊化成靜態(tài)庫,在下次需要使用此功能的時候直接拖進工程
和別人分享你的代碼庫,但是又不想讓別人看見你的代碼實現(xiàn)
在使用第三方sdk常見到
無論是.a靜態(tài)庫還是.framework靜態(tài)庫,我們都是需要的是二進制文件+.h+.其他資源文件的形式,只不過是.a文件本身就是二進制文件,需要我們自己配上.h和其他資源文件,而.framework本身包含了.h文件和其他文件,可以自己使用
5.圖片資源的處理:兩種靜態(tài)庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內(nèi)容可以向其中添加圖片資源。
6.category是我們實際開發(fā)項目中經(jīng)常用到的,把category打成靜態(tài)庫是沒有問題的,但是在用這個靜態(tài)庫的工程中,調(diào)用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC。
如果一個靜態(tài)庫很復雜,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。
(一)framework靜態(tài)庫的創(chuàng)建流程

8.點擊next后會出現(xiàn)下面文件


9.把需要公開的頭文件引入

10.把需要公開的頭文件設為Public


11.分別選擇真機模式和模擬器模式(任意一個模擬器都可以),command + b編譯一下

12.編譯后會發(fā)現(xiàn)

13.選中framework,show in finder

14.會看到有兩個不同環(huán)境下生成的framework

15.接下來就是合并這兩個環(huán)境的的靜態(tài)庫

打開終端輸入:
- lipo -create
- 第一個文件中MyLibrary文件的路徑拖入終端
- 第二個文件中MyLibrary文件的路徑拖入終端
- -output 生成新的文件的路徑(注意留空格)
- 然后把新生成的替換第一個framework中的文件
此時一個可以在真機和模擬器下使用的靜態(tài)庫就創(chuàng)建好了

將生成的MyLibrary替換任意一個framework中的MyLibrary就可以將此framework拿去使用了
(二).a靜態(tài)庫的創(chuàng)建

17.和創(chuàng)建framework是一樣的,剛開始因為不存在對應的靜態(tài)庫文件,因此會顯示紅色,當在編譯之后會由紅色變成黑色

18.同樣需要修改的地方,此處是為了支持5c要添加黯然armv7s

這里不需要改,因為默認的已經(jīng)改好

18.此處設置要公開的頭文件


19.打開終端輸入:

- lipo -create
- 第一個文件中l(wèi)ibMyLibrary.a 文件的路徑拖入終端
- 第二個文件中l(wèi)ibMyLibrary.a文件的路徑拖入終端
- -output 生成新的文件的路徑(注意空格)
- 然后把新生成的替換第一個framework中的文件
此時一個可以在真機和模擬器下使用的靜態(tài)庫就創(chuàng)建好了
.a文件和.framework的區(qū)別在于.a文件在拖入項目的時候要把對應的.h文件一起拖入