簡述
為了滿足既供用戶使用又維持代碼保密性的需求,這時我們就有必要創建 庫文件。蘋果在這個方面提出了靜態庫和動態庫的概念。其中,由于蘋果商店會拒絕含有私人創建的動態庫的App, 故靜態庫相對來說較流行。 圈內比較大的第三方幾乎都在提供靜態庫。
自問自答
靜態庫和動態庫的形式
靜態庫 .a和.framework
動態庫 .a和.frameworkframework 為什么既是靜態庫又是動態庫
系統的.framework 是動態庫,我們自己可以創建.framework的靜態庫-
.a 和 .framework(靜態)有什么區別
.a是一個純二進制文件,.framework中除了有二進制文件外還有資源文件
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用
.a +.h + sourceFile = .framework靜態庫:鏈接時,靜態庫會被完整地復制到可執行文件中,被多次使用就有多份冗余拷貝
動態庫:鏈接時不復制,程序運行時由系統動態加載到內存供程序調用,系統只加載一次,多個程序共用,節省內存(項目中如果含有個人創建的動態庫,則會被拒) 靜態庫文件的版本
真機-Debug版本
真機-Release版本
模擬器-Debug版本
模擬器-Release版本Debug版本和 Release版區別
Debug版本
含完整的符號信息,以方便調試,不會對代碼進行優化
Release版本
不會包含完整的符號信息,它的執行代碼是進行過優化的,它的大小比Debug版本小,在執行速度方面,Release版本更快(一般采用 Release版本)
注意:
- 理解.a 靜態庫和 .framework靜態庫
我們在程序中需要的都是二進制文件(.m或其它) + 頭文件( .h) + 資源文件。不同的是,.a 靜態庫本身就是二進制文件,我們只需要配上.h 和 其它資源文件就能使用,.framework本身已經包含.h 和 其它文件,可以直接使用 - 圖片資源
兩種靜態庫一般都是把圖片文件單獨的放在.bundle文件中。一個情況下,.bundle的名字和.a或者.framework的名字相同。創建.bundle方法:新建一個文件夾,把后綴改成.bundle。右鍵包內容就可以添加圖片資源的。 - 當我們在把資源打成靜態庫的時候,若里面包含category文件,使用的時候會找不到改方法的運行時錯誤(selector not recognized)。這個時候我們就應該知道需要在 build setting 的 other linker flag 標示符里面添加 -ObjC 。
- 若一個靜態的需要暴露的.h 文件很多,可以直接在靜態庫的內部創建一個.h文件(一般該.h文件的名字需要和靜態庫相同),包含所有需要暴露的.h文件。然后把這個.h 文件暴露出來就OK。
制作靜態庫 - .a & Debug版
-
新建靜態庫 并且 命名
-
將需要被打包的文件放入工程中
-
設置需要暴露給外界的文件(.h)
-
打包支持 模擬器 和 真機 的靜態庫(分別選擇真機(不要連接iOS設備)和模擬器)
- 查看打包好的靜態庫
按下 cmd + ↑ 進入上層文件夾。兩個文件夾里面的.a 分別對應模擬器和真機的靜態庫。
** Debug-phoneos: 真機對應文件夾 **
** Debug-phonesimulator : 模擬器對應文件夾 **
可以用下面的命令查看靜態庫支持的CPU架構
<pre><code>lipo -info xxx.a
</code></pre>
分別查看打包好的模擬器和真機的靜態庫所支持的CPU架構
你會發現模擬器的靜態庫少了 i386架構。
原因: Build Active Architecture Only 是控制編譯CPU架構的,我們需要在Debug中將其打開。YES表示只編譯選中模擬器對應的版本。NO則是表示編譯所有版本。將下圖中的YES設置成 NO即可。并且重新編譯。
6 使靜態庫同時支持真機和模擬器
合并使用下面命令
<pre><code>lipo -create Debug-iphoneos/xxx.a Debug-iphonesimulator/xxx.a -output xxx.a
</code></pre>
7.收尾工作,建立對外訪問的文件夾
制作靜態庫 - .a & Release版
跟Debug版本步驟一樣,只不過將編譯框架改為Release.
制作靜態庫 - .framework版
步驟跟制作 .a靜態庫基本一致,注意以下幾點
-
創建靜態庫的時候,選擇framework
-
編譯的時候,請注意將其改為編譯成靜態庫(默認是動態庫)
-
合并靜態庫的時候是合并.framework文件里面的對應名稱的文件
-
收尾的時候記住將原先的那個對應名稱的文件給刪除,然后將合成的放入里面
參考博客及文章