iOS-動態庫與靜態庫
簡介
在企業開發中,一些核心技術或者常用框架,出於安全性和穩定性的考慮,不想被外界知道,所以會把核心程式碼打包成靜態庫,只暴露標頭檔案給程式設計師使用(比如:友盟、百度地圖等第三方的sdk)
靜態庫和動態庫的存在形式
• 靜態庫:.a 和 .framework
• 動態庫:.dylib(xcode7以上時.tbd) 和 .framework
靜態庫和動態庫的區別
• 靜態庫:連結時,靜態庫會被完整地複製到可執行檔案中,被多次使用就有多份冗餘拷貝
• 動態庫:連結時不復制,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只加載一次,多個程式共用,節省記憶體
修改:之前說##專案中如果使用了動態庫,會蘋果拒接##,但在Xcode 6(iOS 8)之後可以使用動態庫, 在官方文件中也有了說明(iOS developers can now create dynamic frameworks),實際上不僅僅是iOS 8及之後可以使用動態庫,低版本的也可以使用,只不過低版本會需要手動的使用dlopen()載入下。動態庫上架會有一些機審的規則需要注意下,至於能不能上架,答案是肯定的。
靜態庫檔案的版本(4種)
• 真機-Debug版本
• 真機-Release版本
• 模擬器-Debug版本
• 模擬器-Release版本
Debug(除錯)版本
1. 含完整的符號資訊,以方便除錯
2. 不會對程式碼進行優化
Release(釋出)版本
1. 不會包含完整的符號資訊
2. 執行程式碼是進行過優化的
3. 大小會比Debug版本的略小
4. 在執行速度方面,Release版本會更快些(但不意味著會有顯著的提升)
在開發中都打包Release(釋出)版本,提供外界
製作靜態庫
1.新建靜態庫,選擇新建Cocoa Touch Static Library檔案
2.新建檔案後,會自動生成與檔名相同的.h和.m檔案,可在其中編輯,也將其刪除新建
3.在Buiding Phases中新建Header Phase,將檔案中所有.h檔案新增至其中
新增.h檔案會在project中,將其全部選中拖入public中
4.開啟Products檔案,會看到.a檔案,此時.a檔案是不存在故為紅色的,選擇裝置為ios 裝置編譯(Command+B)生成支援真機的Debug版本,選擇ios模擬器變異 ,生成支援模擬器的Debug版本,此時.a檔案變為黑色
5.將檔案show in finder,會看到對應的靜態庫,裡面包括.a檔案和所有的.h檔案,將其內容匯入新的工程中即可使用。
6.合併靜態庫,在終端中進入對應檔案,輸入lipo -create Debug-iphoneos/XXXX.a Debug-iphonesimulator/XXXX.a - output YYYY.a 將XXXX.a靜態庫合併成YYYY.a靜態庫(如lipo -create Debug-iphoneos/libHTTPRequestLib.a Debug-iphonesimulator/libHTTPRequestLib.a - output HTTPRequest.a)
使用對應的HTTPRequest.a和.h檔案即可同時支援模擬器和真機。
[注意]生成靜態庫是模擬器還是真機,若使用的型別不同會有相應的報錯,生成靜態庫時對應的CPU不同也會有報錯
裝置的CPU架構簡介(補充知識)
模擬器:
• 4s~5 : i386
• 5s~6plus : x86_64
真機:
• 3gs~4s : armv7
• 5~5c : armv7s (靜態庫只要支援了armv7,就可以跑在armv7s的架構上)
• 5s~6plus : arm64