1. 程式人生 > >iOS-動態庫與靜態庫

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中

新建Header Phase

4.開啟Products檔案,會看到.a檔案,此時.a檔案是不存在故為紅色的,選擇裝置為ios 裝置編譯(Command+B)生成支援真機的Debug版本,選擇ios模擬器變異 ,生成支援模擬器的Debug版本,此時.a檔案變為黑色

生成Debug版本

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