庫是共享程序代碼的方式,通常分爲靜態庫和動態庫。html
程序編譯通常需經預處理、編譯、彙編和連接幾個步驟。在應用中,有一些公共代碼是須要反覆使用,就把這些代碼編譯爲「庫」文件;在連接步驟中,鏈接器將從庫文件取得所需的代碼,複製到生成的可執行文件中。這種庫稱爲靜態庫。(編譯期載入)ios
其特色是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被屢次使用就會有多份冗餘拷貝。 函數
靜態庫: 以 .a / .framework 結尾 .net
a:.a / 與.framework 的區別htm
@1 .a是一個純二進制文件,.framework中除了有二進制文件以外還有資源文件。blog
@2 .a文件不能直接使用,至少要有.h文件配合,.framework文件能夠直接使用。內存
補充:(。bundle 是資源庫文件)資源
b: 關於 Other Linker Flags(連接器) 參考:http://blog.csdn.net/yaokezaixian/article/details/53666537get
在導入第三方的靜態庫的時候,運行時會遇到selector not recognized的錯誤io
1》緣由:OC的連接器並不會爲每一個方法創建符號表,而是僅僅爲類創建了符號表。這樣的話,若是靜態庫中定義了已存在的一個類的分類,連接器就會覺得這個類已經存在,不會把分類和核心類的代碼合起來。這樣的話,在最後的可執行文件中,就會缺乏分類裏的代碼,這樣函數調用就失敗了。
2》解決方案:設置 Other Linker Flags
設置的參數以下:
-ObjC:加了這個參數後,連接器就會把靜態庫中全部的OC類和分類都加載到最後的可執行文件中
-all_load:會讓連接器把全部找到的目標文件都加載到可執行文件中,可是千萬不要隨便使用這個參數!假如你使用了不止一個靜態庫文件,而後又使用了這個參數,那麼你頗有可能會遇到ld: duplicate symbol錯誤,由於不一樣的庫文件裏面可能會有相同的目標文件,因此建議在遇到-ObjC失效的狀況下使用-force_load參數。
-force_load:所作的事情跟-all_load實際上是同樣的,可是-force_load須要指定要進行所有加載的庫文件的路徑,這樣的話,你就只是徹底加載了一個庫文件,不影響其他庫文件的按需加載
因爲真機庫與模擬器庫的存放路徑不一致,爲了方便使用,一般都會將兩個庫進行合成
詳見:http://www.cnblogs.com/qingjoin/archive/2013/01/31/2886985.html
動態庫又稱動態連接庫(Dynamic Link Library 簡寫爲:DLL)DLL是一個包含可由多個程序同時使用的代碼和數據的庫。[ios暫時只容許使用系統動態庫];(運行期載入)
特色: 連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存。
以 .dylib(.tbd)/.framework 結尾
a: .framework的區分
系統的.framework是動態庫,本身創建的.framework是靜態庫。