文章出處

一.靜態庫簡介

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: arm64

4.查看靜態庫支持的架構
    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 = .framework
4>  建議使用.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

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()