靜態(tài)庫

靜態(tài)庫

1. 靜態(tài)庫簡(jiǎn)介

  1. 什么是庫?

     庫 就是程序代碼的集合, 是共享程序代碼的一種方式
    
  2. 庫的分類?

     > 開源庫
         公開源代碼, 能看到具體實(shí)現(xiàn)
         例如SDWebImage, MJRefresh, AFNetworking...
    
     > 閉源庫
         不公開源代碼, 是經(jīng)過編譯后的二進(jìn)制文件, 看不到具體實(shí)現(xiàn),只暴露.h文件
         主要分為: 靜態(tài)庫 和 動(dòng)態(tài)庫
    
  3. 靜態(tài)庫的存在形式?

     .a
     .framework
    
  4. 動(dòng)態(tài)庫的存在形式?

     .dylib
     .framework
    
  5. 靜態(tài)庫和靜態(tài)庫的區(qū)別?

     > 靜態(tài)庫在鏈接時(shí), 會(huì)被完整的復(fù)制到可執(zhí)行文件中; 被多次使用, 就有多份拷貝;
     > 動(dòng)態(tài)庫則不會(huì)復(fù)制, 只有一份. 程序運(yùn)行時(shí)動(dòng)態(tài)加載到內(nèi)存; 系統(tǒng)只加載一次, 多個(gè)程序共用, 節(jié)省內(nèi)存;
     > 但是!!!! 項(xiàng)目中如果使用到自己的動(dòng)態(tài)庫, 不允許上架!
     > 不過WWDC2014上公布的 蘋果對(duì)ios8開放動(dòng)態(tài)加載dylib的接口,也就是說開放了動(dòng)態(tài)庫掛載
    
  6. 靜態(tài)庫應(yīng)用場(chǎng)景?

     > 保護(hù)自己的核心代碼
         國(guó)內(nèi)的企業(yè),掌握有核心技術(shù),同時(shí)是又希望更多的程序員來使用其技術(shù),因此采用"閉源"的方式開發(fā)使用,如百度地圖,友盟等
     > 將MRC的項(xiàng)目,打包成靜態(tài)庫, 可以在ARC下直接使用, 不需要轉(zhuǎn)換
         設(shè)置Objective-C Automatic Reference Counting -> NO
    

2. 靜態(tài)庫和動(dòng)態(tài)庫的制作

  1. 靜態(tài)庫和動(dòng)態(tài)庫的制作圖解

  2. 注意事項(xiàng):

     > 模擬器下的靜態(tài)庫和真機(jī)下的靜態(tài)庫不能共用
    
  3. 注意靜態(tài)庫所支持的架構(gòu)

     不同機(jī)型的CPU, 對(duì)應(yīng)的架構(gòu)不同;
         模擬器:
             4s----5  : i386
             5s----6sPlus : x86_64
         真機(jī):
             3gs---4s : armv7
             5/5c : armv7s(armv7兼容armv7s)
             5s---6sPlus: arm64
    
  4. 查看靜態(tài)庫支持的架構(gòu)
    lipo -info 庫文件

  5. 合并靜態(tài)庫(模擬器和真機(jī)都支持)

     lipo -create 庫1 庫2 -output 終極庫
    

3 .a靜態(tài)庫和.framework靜態(tài)庫的區(qū)別?

1> .a是一個(gè)純二進(jìn)制文件,.framework中除了有二進(jìn)制文件之外還有資源文件
2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
3> .a + .h + sourceFile = .framework
4> 打包靜態(tài)庫建議使用.framework

4. 靜態(tài)庫開發(fā)中的常見問題

問題1: 有些第三方庫會(huì)使用到一些圖片素材,例如公司的logo等。
    由于Xcode默認(rèn)在編譯時(shí)會(huì)把所有的素材文件導(dǎo)入到mainBundle中,直接將文件資源拖到靜態(tài)庫或者新建文件夾保存素材文件的方式,最終可能與使用靜態(tài)庫的程序沖突。
    在靜態(tài)庫中如果要使用圖片素材,會(huì)利用bundle的手段,步驟:
        1>  建立bundle,并且向其中添加圖片
        2>  創(chuàng)建一個(gè)類方法,返回圖片
        3>  編譯
        4>  調(diào)用方如果需要使用,需要導(dǎo)入 .h + .a + XXX.bundle

問題2: 如果用戶需要導(dǎo)入的頭文件過多怎么加?
    建議使用一個(gè)主頭文件包含其他頭文件,讓用戶只導(dǎo)入一個(gè)主頭文件

問題3: 靜態(tài)庫程序怎樣測(cè)試?
    靜態(tài)庫本身就是一個(gè)小項(xiàng)目,實(shí)現(xiàn)某些功能,但是這些功能在開發(fā)中也需要測(cè)試.而測(cè)試代碼又不能作為靜態(tài)庫的一部分
    解決方案:創(chuàng)建復(fù)合項(xiàng)目,可參考->2.靜態(tài)庫和動(dòng)態(tài)庫的制作圖解中->四、靜態(tài)庫使用中的一些注意點(diǎn)

5. 補(bǔ)充: swift動(dòng)態(tài)庫打包以及使用

    補(bǔ)充: swift支持動(dòng)態(tài)庫打包以及使用,不支持靜態(tài)庫。動(dòng)態(tài)庫的打包同上述->2.靜態(tài)庫和動(dòng)態(tài)庫的制作圖解中->五、動(dòng)態(tài)庫的制作。
    swift暴漏接口, 需要使用public關(guān)鍵字
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別 首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 12,324評(píng)論 3 42
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動(dòng)態(tài)庫有什么異同?靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗...
    190CM閱讀 4,515評(píng)論 0 4
  • 簡(jiǎn)介 什么是庫? 庫是程序代碼的集合,是共享程序代碼的一種方式 根據(jù)源代碼的公開情況,庫可以分為2種類型 開源庫 ...
    JonesCxy閱讀 604評(píng)論 0 0
  • 一、前言 “隔著一段距離看,很多有趣的知識(shí)看起來都很唬人?!痹谖页醭雒]的時(shí)候著實(shí)覺得那些后綴名為“.framew...
    蘿卜醬紫閱讀 801評(píng)論 0 5
  • 一. 靜態(tài)庫的簡(jiǎn)介 庫所謂庫, 就是講程序代碼集合, 封裝為一個(gè)庫文件, 他是共享代碼的一種方式, 可以將自己的代...
    面糊閱讀 871評(píng)論 0 49

友情鏈接更多精彩內(nèi)容