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)中 - 一般我們都要編譯兩種文件給調用者
真機版本
+模擬器版本
,編譯的時候我們分別選擇iPhone
和iOS 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