一、靜態庫和動態庫的區別:
靜態庫和動態庫是相對編譯期和運行期的,靜態庫以 .a 和 .framework 形式存在,鏈接時,靜態庫會被完整地復制到可執行文件中,被多次使用就有多份冗余拷貝;
動態庫以 .dylib 和 .framework 形式存在,鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存,一般只能由系統創建。
靜態庫和動態庫的存在形式
靜態庫: .a 和 .framework
動態庫: .dylib 和 .framework
注:項目中如果使用了自制的動態庫,不能被上傳到 AppStore
靜態庫分為真機—Debug(調試)版本、真機—Release(發布)版本、模擬器—Debug版本、模擬器—Release版本;開發中一般都打包Release(發布)版本,將真機和模擬器版本合并,提供外界。
二、創建靜態庫
1、新建項目,點擊iOS—Framework&Library—Cocoa Touch Static Library。
系統自動生成以工程名命名的.h和.m文件,可自定義的在目錄下添加或刪除文件。
注意目錄下Products文件夾有一個.a文件為紅色,說明文件并不存在。
這里我們將系統生成的.h和.m文件刪除。
2、點擊Build Phases—Copy Files,左下角點擊+號按鈕,添加你需要暴露的接口頭文件。
如果你在靜態庫工程中使用了category,那么你可能會碰到鏈接問題,解決的辦法就是需要同時在生成靜態 ? ? ? ? ?庫的工程和使用靜態庫的工程中使用“-all_load”編譯選項,即在對應target的"Build Settings"中的“Other Linker Flags”選項添加“-all_load”。
注意:使用靜態庫的工程中是一定要加該編譯選項的!至于生成靜態庫的工程中加不加沒有試過,不過建議還是加上該編譯選項。
3、點擊Build Phases左上角的+號按鈕,選擇New Headers Phase?選擇需要暴露出來的 .h 文件
4、查看Build Active architecture only 都改為NO
Yes表示只編譯選中模擬器設備對應的架構,
No則為編譯所有模擬器設備支持的cup架構
(Debug版本同理)
5、分別在模擬器和真機下Command+B編譯一下,Products文件夾下的.a文件變為黑色,表示創建成功,否則失敗
6、選中Products文件夾下的.a文件,右擊 “Show In Finder” ,查看制作好的 .a 文件
Debug-iphoneos 文件夾里面的東西是用在真機上的
Debug-iphonesimulator 文件夾里面的東西是用在模擬器上的
如果 Scheme 是 Release 模式,生成的文件夾就以 Release 開頭
7、.a 文件能同時用在真機和模擬器上,需要進行合并
在終端輸入指令: lipo -create ?模擬器.a文件的路徑 ?真機.a文件的路徑 ?-output ?合并后的保存路徑(.a)
例如:lipo -create /Users/xxxx/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphoneos/libxxx.a ? ?/Users/xxxx/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphonesimulator/libxxx.a ?-output /Users/shelin/Desktop/StaticLib.a
8、使用:只需將.a和暴露出來的.h頭文件導入工程目錄下就可供外界使用。