一、靜態庫和動態庫的區別:
靜態庫和動態庫是相對編譯期和運行期的,靜態庫以 .a 和 .framework 形式存在,鏈接時,靜態庫會被完整地復制到可執行文件中,被多次使用就有多份冗余拷貝;動態庫以 .dylib 和 .framework 形式存在,鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存,一般只能由系統創建。
二、靜態庫簡介:
1、靜態庫分為真機—Debug(調試)版本、真機—Release(發布)版本、模擬器—Debug版本、模擬器—Release版本;開發中一般都打包Release(發布)版本,將真機和模擬器版本合並,提供外界。
2、使用場景:在項目開發的過程中,例如兩個公司之間業務交流,不可能把源代碼都發送給另一個公司,這時候將私密內容打包成靜態庫,別人只能調用接口,而不能知道其中實現的細節。
三、用Xcode7創建靜態庫
.a文件版本(以制作AFNetworking靜態庫為例)
1、新建項目,點擊iOS—Framework&—Cocoa Touch Static Library。
給你的工程命名為StaticLib
2、系統自動生成以工程名命名的.h和.m文件,可自定義的在目錄下添加或刪除文件,注意目錄下Products文件夾有一個.a文件為紅色,說明文件並不存在。這裡我們將系統生成的.h和.m文件刪除。
將AFNetworking的所有文件導入工程目錄下
3、點擊Build Phases—Copy Files,左下角點擊+號按鈕,添加你需要暴露的接口頭文件。如果你在靜態庫工程中使用了category,那麼你可能會碰到鏈接問題,解決的辦法就是需要同時在生成靜態庫的工程和使用靜態庫的工程中使用“-all_load”編譯選項,即在對應target的"Build Settings"中的“Other Linker Flags”選項添加“-all_load”,注意:使用靜態庫的工程中是一定要加該編譯選項的!至於生成靜態庫的工程中加不加沒有試過,不過建議還是加上該編譯選項。
點擊Add添加
4、然後點擊左上角,選擇Edit Scheme,Build Configuration下選擇Release,先注意檢查下面Release是否為NO:Yes表示只編譯選中模擬器設備對應的架構,No則為編譯所有模擬器設備支持的cup架構(Debug版本同理),選擇NO,然後分別在模擬器和真機下Command+B編譯一下,會看到Products文件夾下的.a文件變為黑色,這個.a文件就是我們想要得到的靜態庫,這裡會出現一個問題你先編譯的模擬器會發現.a依然是紅色,你需要模擬器和真機都編譯後.a才會變成黑色,這應該是Xcode本身的問題。
注:關於靜態庫對CPU架構的支持,首先了解iOS設備CPU架構方面的知識,ARM是微處理器行業的一家知名企業,arm處理器以體積小和高性能的優勢在嵌入式設備中廣泛使用,幾乎所有手機都是使用它的。
模擬器:iphone4s~5 : i386 iphone5s~6plus : x86_64
真機:iphone3gs~4s : armv7 ?iphone5~5c : armv7s (靜態庫只要支持了armv7,就可以跑在armv7s的架構上) iphone5s~6plus : arm64
armv6, armv7, armv7s是ARM CPU的不同指令集,原則是向下兼容的。例如iPhone4S CPU支持armv7, 但它同時兼容armv6,只是使用armv6指令可能無法充分發揮它的特性。
這裡再補充一下查看靜態庫.a對處理器架構的支持,先cd到.a文件的路徑下,命令行輸入:lipo -info xxxxx.a
5、通過終端打開路徑/Users/shelin/Library/Developer/Xcode/DerivedData/,選擇對應的工程文件夾。
打開Build—Products文件夾,會看到Release-iphoneos和Release-iphonesimulator文件夾,分別是真機和模擬器的.a文件,為了使用方便我們將兩個版本的.a文件合並。
6、合並真機和模擬器.a文件,在終端輸入以下命令行:lipo -create? 模擬器.a文件的路徑 真機.a文件的路徑 -output 合並後的保存路徑(例:lipo -create /Users/shelin/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphoneos/libxxx.a? /Users/shelin/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphonesimulator/libxxx.a? -output /Users/shelin/Desktop/StaticLib.a)最終會在桌面得到一個合並後的StaticLib.a文件,再將暴露出來的.h頭文件一起復制出來。
7、使用:只需將.a和暴露出來的.h頭文件導入工程目錄下就可供外界使用。
.framework版本:
待補充......