靜態庫和動態庫
靜態庫和動態庫的存在形式
靜態庫: .a 和 .framework
動態庫: .dylib 和 .framework
靜態庫和動態庫在使用上的區別
靜態庫:鏈接時,靜態庫會被完整地復制到可執行文件中, 被多次使用就有多份冗余拷貝
動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存
制作 .a
新建項目-> 選擇 “Cocoa Touch Static Library”
就在.h文件中,寫入功能函數!簡單的直接寫入1個方法,並實現方法,例子是把輸入的字符串打印兩邊
#import <Foundation/Foundation.h> @interface MyStaticLibraryDM : NSObject //將輸入的字符串打印兩邊 -(void)printMyInput:(NSString*)inputString; @end
#import "MyStaticLibraryDM.h" @implementation MyStaticLibraryDM -(void)printMyInput:(NSString*)inputString{ NSLog(@"inputString === %@ twice is ==== %@",inputString,inputString); } @end
然后,調試代碼無誤后,就可以進行編譯了
編譯靜態庫
注意:需要修改Build Settings中的 Build Active Architecture Only 以滿足運行不同CPU環境的模擬器。 將此設置為NO。
在不同編譯環境下編譯會生成四種靜態庫,debug模擬器,debug真機,release模擬器,release真機,我們需要將運行環境調至不同的狀態並生成如上四種形式的靜態庫。這里只以一種情況為例:
設置是Debug還是release
選擇Edit Scheme--> Buid Configuration設置為release
設置模擬器還是真機
就是設置模擬器還是真機,因為之前我們將只編譯當前環境設置為NO,所以編譯出來的靜態庫會支持各種CPU環境。
最后按住 command+b 編譯!
你會發現你的靜態庫文件從紅色變成了黑色,這就是編譯完成了啊。可以 show in finder 查看文件所在位置。
上面是我在不同環境運行之后的結果
Debug-iphoneos 文件夾里面的東西是用在真機上的
Debug-iphonesimulator 文件夾里面的東西是用在模擬器上的
其他是在Release模式環境生成的
如果想讓一個 .a 文件能同時用在真機和模擬器上,需要進行合並
在終端輸入指令
lipo -create 靜態庫1 靜態庫2 -output 新靜態庫名稱.a
localhost:~ micaimanong$ cd /Users/micaimanong/Library/Developer/Xcode/DerivedData/MyStaticLibraryDM-fczwjaefnkvdmjelggxccgpicgwy/Build/Products
localhost:Products micaimanong$ lipo -create Debug-iphoneos/libMyStaticLibraryDM.a Debug-iphonesimulator/libMyStaticLibraryDM.a -output libMyStaticLibraryDM.a
先進入products 在將其中的兩個合並 合並之后生成一個新的.a文件
如下圖所示 libMyStaticLibraryDM.a 支持模擬器和真機
最后就是引用了

之后引用文件並實現方法
打印如下 將輸入的字符串打印了兩邊
如果遇到下面的問題
原因是你導入錯誤的編譯版本。
以上錯誤,是你的庫文件(.a)為真機版本,你卻用模擬器來調試程序。將調試目標換成真機,或者使用合並之后的(.a)文件也可以解決。
操作時會遇到很多問題,具體問題具體對待。