靜態庫

OC中庫的種類


靜態庫

  • .a
  • .framework(被蘋果官方逼出來的產物)

動態庫

  • framework
  • dylib(蘋果官方專用)

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

  • 靜態庫在鏈接的時,會被完整的復制到可執行文件中,被多次使用就有多份冗余拷貝
  • 動態庫在鏈接的時候不會復制,程序運行的時候由系統動態加載到內存,共程序使用系統只加載一次,多個程序共用,節省內存

為什么蘋果不推薦我們使用自己做的動態庫

  • 由于動態庫是供多個應用程序使用的,如果我們使用了動態庫到用戶的手機上,可能動態庫上的某些方法名字或者函數名字跟其他動態庫有沖突,到時候會造成系統的一團亂糟

靜態庫(.a)的制作過程

  • 注意: 如果靜態庫中包含了Category,有時候在使用靜態庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance),在使用靜態庫的工程中配置other setting->Other Linker Flags為-ObjC
  • 創建一個靜態庫,把里面產生的源文件刪除
  • 如果庫文件比較多,我們要注意先到 target -> Build Phases -> 點+號創建 Headers 出來
  • 把要編譯的庫源文件拖到項目中
  • target -> Build Phases -> Headers中選擇庫文件中要暴露出來的頭文件(拖到public)中
  • 一般我們都要編譯兩種文件給調用者 真機版本 + 模擬器版本,編譯的時候我們分別選擇 iPhoneiOS Device兩項來編譯
  • 如果沒有特殊情況的話,在 Products 中可以看到 .a文件,如果顯示紅色代表不在項目文件夾中,這時候需要到xcode的緩存中尋找 :
    • (Finder)前往 -> 個人 -> 資源庫 -> Develop -> Xcode -> DerivedData (/Users/mac/Library/Developer/Xcode/DerivedData) ,清空里面的東西
    • 在分別選擇模擬器和真機分別編譯,注意,真機編譯的時候可能會出現錯誤,但是.a能正常編譯出來,錯誤不用管
  • Products 中得到兩個版本的.a文件,為了方便我們需要把兩個版本的.a文件合并成一個版本
  • 終端中的合成指令 : lipo -create 模擬器 .a 文件所在目錄的路徑/.a文件名字 真機 .a 文件所在目錄的路徑/.a文件名字 -output 要合成的 .a 文件名字,通常以lib為前綴
  • 使用的使用注意事項,把 暴露的頭文件提供給調用者, .a文件相當于我們平常使用的.m文件,然后可以正常使用,如果要依賴其他資源文件(例如.bundle文件),要一塊提供給調用者

查看一個靜態庫所支持的 CPU 構架

lipo -info .a全路徑

各版本的CPU構架

armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch
armv7 iPhone4 iPhone4S
armv7s iPhone5 iPhone5C
arm64 iPhone5S
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容