1.庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。
庫分:
靜態庫(.a和.framework)
動態庫(.dylib和.framework)
2.framework為什么即是動態庫又是靜態庫?
因為系統的framework是動態庫,我們自己建立的framework是靜態庫
.a與.framework的區別
.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件
.a文件不能自己使用,至少要和.h文件配合,.framework文件可以自己使用
.a + .h + soureFile = .framework
建議使用.framework
注意:項目中如果使用了自制的動態庫,不能被上傳到 AppStore
3.靜態庫和動態庫在使用上的區別
靜態庫:鏈接時,靜態庫會被完整地復制到可執行文件中, 被多次使用就有多份冗余拷貝 (左圖所示)
動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存 (下圖所示)
4.為什么要使用靜態庫?
方便代碼的共享和重復利用,可以吧固定我業務模塊化成靜態庫,在下次需要使用此功能的時候直接拖進工程
和別人分享你的代碼庫,但是又不想讓別人看見你的代碼實現
在使用第三方sdk常見到
無論是.a靜態庫還是.framework靜態庫,我們都是需要的是二進制文件+.h+.其他資源文件的形式,只不過是.a文件本身就是二進制文件,需要我們自己配上.h和其他資源文件,而.framework本身包含了.h文件和其他文件,可以自己使用
5.圖片資源的處理:兩種靜態庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。
6.category是我們實際開發項目中經常用到的,把category打成靜態庫是沒有問題的,但是在用這個靜態庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態庫的工程中配置other linker flags的值為-ObjC。
如果一個靜態庫很復雜,需要暴露的.h比較多的話,就可以在靜態庫的內部創建一個.h文件(一般這個.h文件的名字和靜態庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。
(一)framework靜態庫的創建流程
8.點擊next后會出現下面文件
9.把需要公開的頭文件引入
10.把需要公開的頭文件設為Public
11.分別選擇真機模式和模擬器模式(任意一個模擬器都可以),command + b編譯一下
12.編譯后會發現
13.選中framework,show in finder
14.會看到有兩個不同環境下生成的framework
15.接下來就是合并這兩個環境的的靜態庫
打開終端輸入:
- lipo -create
- 第一個文件中MyLibrary文件的路徑拖入終端
- 第二個文件中MyLibrary文件的路徑拖入終端
- -output 生成新的文件的路徑(注意留空格)
- 然后把新生成的替換第一個framework中的文件
此時一個可以在真機和模擬器下使用的靜態庫就創建好了
將生成的MyLibrary替換任意一個framework中的MyLibrary就可以將此framework拿去使用了
(二).a靜態庫的創建
17.和創建framework是一樣的,剛開始因為不存在對應的靜態庫文件,因此會顯示紅色,當在編譯之后會由紅色變成黑色
18.同樣需要修改的地方,此處是為了支持5c要添加黯然armv7s
這里不需要改,因為默認的已經改好
18.此處設置要公開的頭文件
19.打開終端輸入:
- lipo -create
- 第一個文件中libMyLibrary.a 文件的路徑拖入終端
- 第二個文件中libMyLibrary.a文件的路徑拖入終端
- -output 生成新的文件的路徑(注意空格)
- 然后把新生成的替換第一個framework中的文件
此時一個可以在真機和模擬器下使用的靜態庫就創建好了
.a文件和.framework的區別在于.a文件在拖入項目的時候要把對應的.h文件一起拖入