iOS .a靜態庫

來源:互聯網
上載者:User

標籤:

[轉載自 “文頂頂”]

一、簡單介紹

1.什麼是庫?

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

 

2.庫的分類

  根據原始碼的公開情況,庫可以分為2種類型

  (1)開源庫

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

    比如SDWebImage、AFNetworking

 

  (2)閉源庫

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

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

 

二、靜態庫和動態庫

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

靜態庫:.a 和 .framework

動態庫:.dylib 和 .framework

 

2.靜態庫和動態庫在使用上的區別

靜態庫:連結時,靜態庫會被完整地複製到可執行檔中,被多次使用就有多份冗餘拷貝(圖1所示)

動態庫:連結時不複製,程式運行時由系統動態載入到記憶體,供程式調用,系統只載入一次,多個程式共用,節省記憶體(圖2所示)

圖1

  

  圖2

      

注意點:項目中如果使用了自製的動態庫,不能被上傳到AppStore

 

三、靜態庫的製作(.a)

(1)選擇“Cocoa Touch Static Library”

(2)輸入靜態庫名稱(以MJRefresh為例)

  

(3)刪除自動產生的檔案

  

(4)添加庫需要包含的原始碼

   

  

注意:資源檔是不能打包到.a檔案中的。

(5)選擇需要暴露出來的.h檔案,.m檔案會自動編譯到.a檔案中

  

  添加,並選擇需要暴露的標頭檔

  

設定(移動)為公開的。

(6)選擇真機裝置,然後 Command+B 編譯,libMJRefresh.a檔案從紅色變為黑色

  這個時候,程式會報錯,因為架構中包含了CGFloat,它是UIKit裡面的東西,因此可以在pch檔案中包含UIKit架構。

  

  再次進行編譯,編譯成功後產生的.a檔案就是靜態庫。

(7)選擇模擬器,依然 Command+B ,模擬器和真機環境下用的.a檔案是分開的

  

(8)右擊“Show In Finder”,查看製作好的.a檔案

     

說明:

Debug-iphoneos檔案夾裡面的東西是用在真機上的

Debug-iphonesimulator檔案夾裡面的東西是用在模擬器上的 

如果Scheme是Release模式,產生的檔案夾就以Release開頭

(9)合并兩個檔案

如果想讓一個.a檔案能同時用在真機和模擬器上,需要進行合并

在終端輸入指令:

  lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

說明:

藍色部分是固定指令

紅色、紫色是真機和模擬器.a檔案的路徑

綠色是所合成.a檔案的路徑

   

  產生的檔案(靜態庫)

      

提示:

1)檔案大小.a檔案的體積(一般情況下)

  真機用的.a > 模擬器用的.a

  所合成.a == 真機用的.a + 模擬器用的.a

2).a的類型

    通過lipo –info libMJRefresh.a可以查看 .a 的類型(模擬器還是真機)

  

(10)如何使用.a

  直接將.a、.h、資源檔拖拽到其他項目中即可

  別人拿到的架構,只有.a檔案和暴露出來的標頭檔

  

注意:如果庫中還包含了一些資源檔(片等),那麼資源檔也應該放在上面的檔案夾中。

 

四、製作靜態庫的注意點

(1)注意:

  無論是 .a 靜態庫還是 .framework 靜態庫,最終需要的都是:二進位檔案 + .h + 其它資源檔

 

(2).a 和 .framework 的使用區別

  .a 本身是一個二進位檔案,需要配上 .h 和 其它資源檔 才能使用

  .framework 本身已經包含了 .h 和 其它資源檔,可以直接使用

 

(3)圖片資源的處理

  如果靜態庫中用到了圖片資源,一般都放到一個bundle檔案中,bundle名字一般跟 .a 或 .framework 名字一致

  bundle的建立:建立一個檔案夾,修改副檔名為 .bundle 即可,右擊bundle檔案,顯示包內容,就可以往bundle檔案中放東西

  建議:自己製作的靜態庫中要用到的圖片資源,不建議直接以png的尾碼名方式拖到項目中使用,而是推薦使用放到bundle檔案中。這樣可以避免靜態庫的圖片名和使用靜態庫的項目中存在的圖片產生衝突。

  1)建立一個檔案夾,把需要打包的資源圖片放在裡面

    

  2)修改副檔名為 .bundle,敲斷行符號,點擊添加。

    

(4)多檔案處理

  如果靜態庫需要暴露出來的 .h 比較多,可以考慮建立一個主標頭檔(一般 主標頭檔 和 靜態庫 同名)

  在主標頭檔中包含所有其他需要暴露出來的 .h 檔案

  使用靜態庫時,只需要#import 主標頭檔

  實際上蘋果官方就是這麼做的,例如:#import <UIKit/UIKit.h>

 

 (5).framework為什麼既是靜態庫又是動態庫

  系統的 .framework 是動態庫

  我們自己建立的 .framework 是靜態庫

 

(6)靜態庫中包含了Category(分類)

如果靜態庫中包含了Category,有時候在使用靜態庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance

解決方案:在使用靜態庫的工程中配置Other Linker Flags為-ObjC

iOS .a靜態庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.