iOS 靜態庫開發

發表於2015-09-23

簡介

在企業開發中,一些核心技術或者常用框架,出於安全性和穩定性的考慮,不想被外界知道,所以會把核心程式碼打包成靜態庫,只暴露標頭檔案給程式設計師使用(比如:友盟、百度地圖等第三方的sdk)

靜態庫和動態庫的存在形式

  • 靜態庫:.a 和 .framework
  • 動態庫:.dylib 和 .framework

靜態庫和動態庫的區別

  • 靜態庫:連結時,靜態庫會被完整地複製到可執行檔案中,被多次使用就有多份冗餘拷貝
  • 動態庫:連結時不復制,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,多個程式共用,節省記憶體

注意:專案中如果使用了動態庫,會蘋果拒接

靜態庫檔案的版本(4種)

  • 真機-Debug版本
  • 真機-Release版本
  • 模擬器-Debug版本
  • 模擬器-Release版本

Debug(除錯)版本

  1. 含完整的符號資訊,以方便除錯
  2. 不會對程式碼進行優化

Release(釋出)版本

  1. 不會包含完整的符號資訊
  2. 的執行程式碼是進行過優化的
  3. 的大小會比Debug版本的略小
  4. 在執行速度方面,Release版本會更快些(但不意味著會有顯著的提升)

所以我們一般開發中都打包Release(釋出)版本,提供外界

裝置的CPU架構簡介(補充知識)

模擬器:

  • 4s~5 : i386
  • 5s~6plus : x86_64

真機:

  • 3gs~4s : armv7
  • 5~5c : armv7s (靜態庫只要支援了armv7,就可以跑在armv7s的架構上)
  • 5s~6plus : arm64

製作靜態庫 – Debug版

1.新建專案

2.新增靜態庫並命名

3.需要打包到進靜態庫的程式碼,放在這個資料夾內

4.重新建立測試類(HSCalculate),提供外界計算兩個數和的方法

HSCalculate.h

HSCalculate.m

5.需要暴露給外界的檔案(介面)

6.打包支援模擬器和真機的靜態庫(分別選擇真機和模擬器執行,就會生成對應的靜態庫)

7.檢視打包好的靜態庫

兩個資料夾,裡面的.a檔案就是打包好的靜態庫

  • Debug-iphoneos : 真機
  • Debug-iphonesimulator:模擬器

可用下面命令檢視靜態庫支援的cpu架構(可檢視上面描述的cpu架構型別)

分別檢視打包好的模擬器與真機的靜態庫所支援的cpu架構

你會發現模擬器的靜態庫少了4s~5 : i386架構

原因:

下面Debug:Yes表示只編譯選中模擬器對應的架構,No則為編譯所有模擬器支援的cup架構(Debug的Yes狀態改為No即可)

修改完後,重新編譯:

8.在本專案對該靜態庫進行除錯,ViewController.m匯入HSCalculate.h,測試執行,你會發現報錯了

報錯:

原因:

需要匯入靜態庫(編譯即可執行成功)

9.同時支援真機與模擬器的靜態庫(需要合併)

真機和模擬器的靜態庫,是不一樣的,不能同時適用在真機和模擬器上,但要滿足這要求的話,要對編譯好的兩個靜態庫進行合併

合併好壞:

  • 好:開發過程中既可以在真機上除錯,也可以在模擬器上除錯
  • 壞:如果靜態庫太大,合併打包後,會非常大,因此很多第三方的靜態庫的.a是區分版本的

合併產生新的靜態庫:

10.把合併好的靜態庫和外界訪問的檔案拉入到新工程,即可使用(inc檔案自己建立的)

新建工程測試:

製作靜態庫 – Release版

跟Debug版步驟一樣,只不過在編譯時,改下面的選項即可

製作靜態庫 – .framework版

步驟跟製作.a靜態庫,基本一致,但要注意的下面幾點:

1.選擇framework

2.編譯時,預設製作成動態庫,要在下面選擇

3.合併靜態庫時,是選.framework檔案裡的libstaticlib檔案

合併:

刪除libstaticlib,libCalculateTool拉入libstaticlib.framework專案中,libstaticlib.framework靜態庫製作完成

相關文章