iOS : 靜態庫

來源:互聯網
上載者:User

標籤:

一.靜態庫簡介1. 什麼是庫?

庫 就是程式碼的集合, 是共用程式碼的一種方式

2. 庫的分類?
  • 開源庫

    公開原始碼, 能看到具體實現

    例如MJExtension, MJRefresh, AFNetworking...

  • 閉源庫

    不公開原始碼, 是經過編譯後的二進位檔案, 看不到具體實現

    主要分為: 靜態庫 和 動態庫

3. 靜態庫的存在形式?
  • .a
  • .framework
4. 動態庫的存在形式?
  • .dylib
  • .framework
5. 靜態庫和動態庫的區別?
  • 靜態庫在連結時, 會被完整的複製到可執行檔中; 被多次使用, 就有多份拷貝;

  • 動態庫則不會複製, 只有一份. 程式運行時動態載入到記憶體; 系統只載入一次, 多個程式共用, 節省記憶體;

  • 但是!!!! 項目中如果使用到自己的動態庫, 不允許上架!

  • 再但是!!! WWDC2014上公布的 蘋果對ios8開放動態載入dylib的介面 也就是說 開放了動態庫掛載
6. 靜態庫應用情境?
  • 保護自己的核心代碼

    國內的企業,掌握有核心技術,同時是又希望更多的程式員來使用其技術,因此採用"閉源"的方式開發使用

      例如:百度地圖,友盟,JPush等
  • 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換
7. 靜態庫的特點?

.a + .h

看不到具體實現的代碼

 

二.靜態庫的製作(.a)1.產生靜態庫大步驟
1. 建立項目時, 直接選擇靜態庫(.a)2. 設定需要暴漏的標頭檔    TARGETS -> Build Phases -> Copy Files    把需要暴漏的標頭檔添加進來即可3. 在模擬器環境下編譯(得到模擬器環境下的靜態庫)    選擇模擬器6S,編譯4. 在真機環境下編譯(得到真機環境下的靜態庫)
2.靜態庫使用測試
1.使用模擬器的靜態庫, 拖入測試工程    使用6S模擬器進行測試, 通過    使用真機, 編譯; 失敗    使用低型號模擬器測試,; 失敗2.測試結果分析    模擬器下的靜態庫和真機下的靜態庫不能共用    主要原因是模擬器和真機CPU架構不一樣(各個模擬器型號之間架構也不一樣)3.注意靜態庫所支援的架構    不同機型的CPU, 對應的架構不同;    模擬器:        4s----5  : i386        5s----6sPlus : x86_64    真機:        3gs---4s : armv7        5/5c : armv7s(armv7相容armv7s)        5s---6sPlus: arm644.查看靜態庫支援的架構    lipo -info 庫檔案    分別選中不同的模擬器, 進行編譯, 查看不同的靜態庫支援架構5.怎樣一次編譯支援多個架構的的靜態庫?    問題描述:        正常情況下, 需要選中每一個模擬器進行編譯, 產生支援對應架構的靜態庫. 然後合并; 非常蛋疼    解決方案:        Build Settings -> Build Active -> NO        表示不止編譯活躍的架構, 讓所有的架構都編譯
3.靜態庫檔案的版本
1.調試版本    1.真機-Debug版本    2.模擬器-Debug版本    特點        - 調試版本會包含完整的符號資訊,以方便調試        - 調試版本不會對代碼進行最佳化2.發布版本    1.真機-Release版本    2.模擬器-Release版本    特點        - 發布版本不會包含完整的符號資訊        - 發布版本的執行代碼是進行過最佳化的        - 發布版本的大小會比調試版本的略小        - 在執行速度方面,發布版本會更快些,但不意味著會有顯著的提升3.怎樣產生不同版本?    項目 -> Edit Scheme -> Run -> Release/Debug 分別進行編譯4.如果想要一個靜態庫, 既可以在模擬器上運行, 也可以在真機上運行怎麼做?    因為靜態庫針對於模擬器和真機產生了不同版本(支援不同架構), 所以沒法同時運行    解決方案:        靜態庫的合并            檢測.a的類型                $ lipo -info libCZTools.a            合并.a                lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a            特點                # 合并.a的好處,開發過程中既可以在真機上調試,也可以在模擬器上調試                # 合并.a的壞處,如果靜態庫太大,合并打包後,會非常大,因此很多第三方的靜態庫的.a是區分版本的                # 今後在使用.a時一定注意版本
三.靜態庫製作(.framework)
  1. 建立功能, 直接選擇.framework靜態庫
  2. 編譯時間, 設定編譯所有架構 

  3. 預設製作的是動態庫, 需要設定連結類型

    target -> Build Settings-> 搜尋 Mach-o Type ; 改為靜態庫

 四.總結1. 靜態庫打包的完整正確步驟!!
1. 確定是靜態庫    .a 的肯定是靜態庫    .framework的需要設定連結類型        target -> Build Settings-> 搜尋 Mach-o Type ; 改為靜態庫

2. 確定支援模擬器或者真機中的所有架構    Build Settings -> Build Active -> NO        表示不止編譯活躍的架構, 讓所有的架構都編譯3. 提供的靜態庫應該是release版本    項目 -> Edit Scheme -> Run -> Release/Debug 分別進行編譯
2. .a靜態庫和.framework靜態庫的區別?
1> .a是一個純二進位檔案,  .framework中除了有二進位檔案之外還有資源檔2> .a檔案不能直接使用, 至少要有.h檔案的配合; .framework檔案可以直接使用3> .a + .h + sourceFile = .framework4>  建議使用.framework
3. 靜態庫開發中的常見問題
問題1: 有些第三方庫會使用到一些圖片素材,例如公司的logo等。    由於Xcode預設在編譯時間會把所有的素材檔案匯入到mainBundle中,可能與使用靜態庫的程式衝突。    解決方案:        在靜態庫中如果要使用圖片素材,會利用bundle的手段            1>  建立bundle,並且向其中添加圖片            2>  建立一個類方法,返回圖片            3>  編譯            4>  調用方如果需要使用,需要匯入 .h + .a + XXX.bundle問題2:如果使用者需要匯入的標頭檔過多怎麼加?    建議使用一個主標頭檔包含其他標頭檔, 讓使用者只匯入一個主標頭檔問題3: 靜態庫程式怎樣測試?    靜態庫本身就是一個小項目, 實現某些功能, 但是這些功能在開發中也需要測試. 而測試代碼又不能作為靜態庫的一部分    解決方案:        建立複合項目
4. 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換

5. 補充: swift動態庫打包以及使用

注意: swift不支援靜態庫

想要暴漏介面出去, 學會使用public關鍵字

6.靜態庫(.framework)合并

http://www.cnblogs.com/KeenLeung/p/5491332.html

 

iOS : 靜態庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.