什麼是庫?
庫是程式**的集合,是共享程式**的一種方式。
根據源**的公開情況,庫可以分為2種型別:
開源庫:公開源**,能看到具體實現,比如sdwebimage、afnetworking。
閉源庫:不公開源**,是經過編譯後的二進位制檔案,看不到具體實現,主要分為:靜態庫、動態庫。
靜態庫和動態庫的存在形式:
靜態庫:.a 和 .framework
動態庫:.dylib 和 .framework
製作.a:建立framework&library中選擇cocoa touch static library,之後輸入名稱,新增庫需要包含的源**,選擇需要暴露出來的.h檔案,.m檔案會自動編譯到.a檔案中。
另外,debug-iphoneos資料夾裡面的東西是用在真機上的,debug-iphonesimulator資料夾裡面的東西是用在模擬器上的,如果scheme是release模式,生成的資料夾就以release開頭。
合併.a:
如果想讓乙個.a檔案能同時用在真機和模擬器上,需要進行合併
在終端輸入指令
lipo -create 真機和模擬器.a檔案的路徑 -output 所合成.a檔案的路徑
.a檔案的體積(一般情況下):
真機用的.a > 模擬器用的.a
所合成.a == 真機用的.a + 模擬器用的.a
若要檢視.a型別,只需要通過lipo –info.a名稱即可檢視 .a 的型別(模擬器還是真機)。
使用.a只需要直接將.a、.h、資源檔案拖拽到其他專案中即可。
模板製作.framework:
手工製作 .framework 過於複雜,借助開源模板進行製作會比較簡單
模板位址
安裝模板
在終端下進入ios-universal-framework/fake framework資料夾
執行指令./install.sh
製作靜態庫的注意點:
無論是 .a 靜態庫還是 .framework 靜態庫,最終需要的都是:二進位制檔案 + .h + 其它資源檔案。
.a 和 .framework 的使用區別:
.a 本身是乙個二進位制檔案,需要配上 .h 和 其它資源檔案 才能使用
.framework 本身已經包含了 .h 和 其它資源檔案,可以直接使用
資源的處理:
如果靜態庫中用到了資源,一般都放到乙個bundle檔案中,bundle名字一般跟 .a 或 .framework 名字一致。
bundle的建立:新建乙個資料夾,修改擴充套件名為 .bundle 即可,右擊bundle檔案,顯示包內容,就可以往bundle檔案中放東西。
多檔案處理:
如果靜態庫需要暴露出來的 .h 比較多,可以考慮建立乙個主標頭檔案
(一般 主標頭檔案 和 靜態庫 同名),在主標頭檔案中包含所有其他需要暴露出來的 .h 檔案,使用靜態庫時,只需要#import 主標頭檔案。
.framework為什麼既是靜態庫又是動態庫:
系統的 .framework 是動態庫,我們自己建立的 .framework 是靜態庫。
另外,如果靜態庫中包含了category,有時候在使用靜態庫的工程中會報「方法找不到」的錯誤(unrecognized selector sent to instance)
解決方案:在使用靜態庫的工程中配置other linker flags為-objc
iOS 靜態庫 在iOS中建立靜態庫
學習了creating a static library in ios tutorial 本想做一下翻譯的工作,但是在網上已經有人翻譯過了,因此不添足。譯文請見 在ios中建立靜態庫 在實踐中,發現了一些奇怪的錯誤。根據文章編寫了程式,imagefilters,寫了指令碼生成通用靜態庫,在corei...
iOS合併靜態庫
對ios專案來說,靜態庫對於裝置 device 和模擬器 simulator 的編譯是不一樣的。需要鏈結靜態庫的工程在編譯device和simulator的時候需要區別對待。需要鏈結到不同的靜態庫。這就很麻煩。解決方法是使用lipo指令,將device靜態庫和simulator靜態庫合併為乙個靜態庫...
iOS靜態庫管理
解決一下幾個問題 1.生成device和simulator通用的.a檔案 2.debug版應用程式呼叫debug版.a,release版應用程式呼叫release版.a 由於ios生成的庫的屬性比較多,因此開發人員需要對靜態庫進行必要的管理。我只是提供了一種我認為比較不錯的辦法,可以相對提高一些效率...