iOS靜態庫的建立跟使用
庫:是程式碼的集合,是共享程式碼的一種形式,庫分為開源庫跟閉源庫。
開源庫
公開原始碼,能看到具體實現過程。
如:AFNetworking,SDWebImage
閉源庫
不公開原始碼,是經過編譯後的二進位制檔案,看不到具體實現。
分為靜態庫跟動態庫
iOS中靜態庫以.a和.framework的形式存在,動態庫以.dylib和.framework形式存在。
蘋果禁止使用者在專案中自己建立使用動態庫,如果使用者在專案中使用自己建立的動態庫,釋出專案會被蘋果拒絕。
所以以下主要是講解靜態庫的建立及使用
靜態庫可用於程式碼的共享與重用,開發第三方SDK……
製作.a
新建專案 選擇“Cocoa Touch Static Library”如下圖:
建立好專案後需要配置一下工程檔案,buildSetting 中設定 build Active Architecture only 為NO讓靜態庫支援所有架構
建立一個測試類 StaticTool 繼承自NSObjec 並在StaticTool中新增一個類方法+(void)shareTest; 用於測試.a檔案的使用
將需要暴露出去的標頭檔案新增到copy File 中如下圖:
未經過編譯的.a檔案是紅色的
編譯後文件是黑色的
在編譯錢先檢查一下是debug還是release模式
這裡就選擇release模式
選擇一個模擬器編譯一下 (最好是選擇一個高階一點的)
編譯後檢視此.a檔案支援什麼架構
通過 lipo -info xxxx.a可檢視.a檔案支援什麼架構
上圖表示.a檔案支援模擬器i386 和 x86_64架構,現在的.a檔案還不支援真機架構,為了支援真機架構需要在真機模式下編譯執行一下。
編譯執行後可檢視.a檔案
兩個資料夾都有.a檔案,使用中需要將這兩個資料夾中的.a檔案進行合併才能同時支援模擬器跟真機架構,為了 方便操作, 我將Release-iphoneos和Release-iphonesimulator這兩個檔案拷貝到桌面一個資料夾test中
在終端中使用lipo -create xxx.a xxx.a -output xxx.a 可以合併生成一個新的.a檔案
tip:生成新的.a檔案需要指定放在那裡 我這裡就指定放在test資料夾內,如下:
檢驗一下新合併好的.a檔案支援什麼架構
現在.a檔案支援既模擬器又支援真機架構了,測試一下.a檔案的使用,新建一個專案,將.a檔案拖入到專案中,並將暴露出來的.h檔案也拖到專案中,如下:
在ViewController.m中匯入#import “StaticTool.h”測試使用
執行後點擊螢幕輸出結果如下:
真機執行測試輸出也是正常的,證明此.a檔案同時支援真機跟模擬器架構
製作.framework
新建一個專案 選擇 Cocoa Touch Framework
建立後的專案如下:
需要配置一下檔案如下:
為了方便測試,把剛剛建立的StaticTool 直接拖到專案中,方便測試.framework的使用
如果.framework中使用的類比較多,可以將相對應的類標頭檔案匯入到FrameworkDemo.h檔案中,如下:
將需要暴露的標頭檔案 拖到public中
接下來的操作跟.a的操作類似 執行前確認是在debug還是release模式下,真機跟模擬器分別執行後 都會生成各自的framework檔案,這時候需要將模擬器跟真機的framework檔案合併才能同時支援兩者。
同樣是使用lipo -create xxx xxx -output xxxx合併兩個framework檔案如下:
用lipo -info xxx檢視新生成的framework檔案支援什麼架構,如下:
可以看出framework同時支援真機跟模擬器架構
接下來就是測試使用framework,將新生成的framework 檔案拖入到Release-iphoneos/FrameworkDemo.framework中進行替換裡面的framework
將替換好後的FrameworkDemo.framework包脫到測試專案中如下:
分別在真機跟模擬器執行 都能正常輸出
.a與.framework的區別
.a是一個純二進位制檔案,.framework中除了有二進位制檔案之外還有資原始檔。
.a檔案不能直接使用,至少要有.h檔案配合,.framework檔案可以直接使用。
.a + .h + sourceFile = .framework。
開發中建議用.framework.
結合.framework一般會在專案中使用到.bundle檔案用來存放資源,比如圖片
bundle檔案的建立如下:
可以將圖片放在.bundle目錄下:
在framework 中定義一個類方法 用於測試獲取bundle檔案資源
重新編譯一下,將.framework檔案匯入到測試執行專案中測試
#import "ViewController.h"
#import <FrameworkDemo/FrameworkDemo.h>
@interface ViewController ()
@property (nonatomic,strong) UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[StaticTool shareTest];
UIImage *image = [StaticTool imageWithBundleName:@"resource" imageName:@"Snip20170521_33"];
self.imageView.image = image;
[self.view addSubview:self.imageView];
}
- (UIImageView *)imageView {
if (!_imageView) {
_imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
}
return _imageView;
}
點選螢幕 可以顯示獲取到圖片 測試成功
以上便是 .a,.framework和.bundle檔案的建立和使用