iOS深入學習(創建靜態庫static library)

在項目開發的過程中,經常使用靜態庫文件。例如兩個公司之間業務交流,不可能把源代碼都發送給另一個公司,這時候將私密內容打包成靜態庫,別人只能調用接口,而不能知道其中實現的細節。

簡介:

庫是一些沒有main函數的程序代碼集合。除了靜態庫,還有動態鏈接庫,他們之間的區別是:靜態庫可以編譯到我們的執行代碼中,應用程序可以在沒有靜態庫的環境中運行;動態庫不能編譯到我們的執行代碼中,應用程序必須在有鏈接庫文件的環境下運行。

創建靜態庫的步驟如下所示,

1、創建Static Library,新建->Project,選擇Static Library,如圖,
這裏寫圖片描述
點擊Next,我將Static Library項目名稱命名爲TimeDate,因爲這是我用於處理時間和日期的靜態庫工程,
這裏寫圖片描述
2、靜態庫文件功能的實現細節

創建了靜態庫Static Library項目之後,Xcode自動爲我們創建了TimeDate.h/.m文件,如下圖所示,
這裏寫圖片描述
這時候我們需要在這裏面填充一些細節,這裏,我想要實現的功能就是將時間戳NSTimeInterval轉換成NSString的功能,那麼代碼的細節如下所示,

TimeDate.h文件

@interface TimeDate : NSObject
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval;
@end
TimeDate.m文件


#import "TimeDate.h"

@implementation TimeDate
- (NSString *)changeToStandardTime:(NSTimeInterval)timeInterval
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *time = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeInterval]];
    return time;
}
@end
上面的代碼就是將NSTimeInterval轉換成NSString,當然這樣肯定有考慮不全面的地方,這不是本篇博客的中心內容,讀者可以忽略;如果有好的建議請告訴我。

3、編譯項目,生成對應的靜態庫.a文件

首先我們先來看一下編譯(Command+B)之前的項目細節,如下圖,

這裏寫圖片描述
這裏我們有兩個細節需要注意的,①表明現在是選擇的是名爲pythonhater的真機Device;②libTimeDate.a文件是紅色狀態,表明這還不是一個實際存在的文件,我們不能在物理磁盤中找到它。只有在編譯以後它纔是一個實實在在的文件。

這時我們編譯項目(Command+B),文件結構如下圖,
這裏寫圖片描述
這時候libTimeDate.a文件變爲黑色狀態了,表明編譯過後它是一個真是存在於物理磁盤的文件,我們右鍵選擇Show in Finder,如下圖,出現了它的物理位置,
這裏寫圖片描述
這裏寫圖片描述
如圖,libTimeDate.a文件隱藏的很深,我們只要知道它存在就好。現在有個問題,我選擇的是pythonhater真機Device進行編譯的,所以這個libTimeDate.a只能針對iOS真機Device進行使用,而不能在模擬器Simulator上面使用,爲了解決這個問題,只要選擇模擬器Simulator進行編譯,就可以生成對應的模擬器運行需要的libTimeDate.a文件,如下圖操作所示,
這裏寫圖片描述
選擇iPhone模擬器編譯,然後右鍵Show in Finder,
這裏寫圖片描述
上面的Debug-iPhones裏面包含iPhone真機所需要的libTimeDate.a靜態庫文件,而下面的Debug-iPhoneSimulator裏面包含的時iPhone模擬器所需要的libTimeDate.a靜態庫文件。

4、合併靜態庫

針對真機和模擬器的靜態庫文件只能在一個平臺下面使用,好在我們可以將真機和模擬器上面的靜態庫文件合併成一個在真機和模擬器都可以使用的靜態庫文件,通過在終端輸入命令即可完成該目的,
這裏寫圖片描述
完整的命令就是:

lipo -create /Users/mini3/Library/Developer/Xcode/DerivedData/TimeDate-cthodjhjpplctjhfdbhmdcuhwnva/Build/Products/Debug-iphoneos/libTimeDate.a /Users/mini3/Library/Developer/Xcode/DerivedData/TimeDate-cthodjhjpplctjhfdbhmdcuhwnva/Build/Products/Debug-iphonesimulator/libTimeDate.a -output /Users/mini3/Desktop/libTimeDate.a
不過這個是相對自己的路徑,讀者可以直接將文件拖到終端即可識別完整的路徑,如下圖所示的方法,
這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述
最後在補充上- output /Users/用戶名/Desktop/libTimeDate.a,這樣就在桌面生成了一個合併過後的libTimeDate.a靜態庫文件,它可以再真機和模擬器上面同時使用。

5、使用靜態庫文件,

這時候我們就可以使用自己創建、編譯生成的靜態庫文件了,將TimeDate.h文件和桌面上面的libTimeDate.a文件拖到想要使用的項目中,如下圖的目錄結構,

這裏寫圖片描述

爲了方便,我直接在AppDelegate中使用創建的靜態庫文件了,代碼如下,

AppDelegate.m文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "AppDelegate.h"
//導入頭文件
#import "TimeDate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    TimeDate *timeDate = [[TimeDate alloc] init];
    NSTimeInterval timeInterval = 123456798;
    NSString *time = [timeDate changeToStandardTime:timeInterval];
    NSLog(@"time is %@",time);
    return YES;
}
輸出的內容是,

2014-06-25 20:56:15.105 StaticLibrarySample[2517:390790] time is 1973-11-30 05:33:18
這時不管是真機還是模擬器都可以編譯通過,正常運行。而使用者只能通過頭文件知道我們提供的藉口,卻不知道實現文件中實現的細節,這有效地隱藏了自己的核心技術和機密內容。

總結:我們開發的就是iOS真機程序,所以可以選擇不合並靜態庫,直接使用真機編譯生成的靜態庫文件進行開發,沒有必要爲了兼容模擬器而合併靜態庫文件。當然,如果有強迫症或者公司設備不夠,那麼還是合併靜態庫文件吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章