iOS-拓展-靜態庫

iOS開發拓展篇—靜態庫

一、簡單介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章