1. 程式人生 > >iOS靜態庫的建立跟使用

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檔案的建立和使用