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真機程式,所以可以選擇不合並靜態庫,直接使用真機編譯生成的靜態庫檔案進行開發,沒有必要為了相容模擬器而合併靜態庫檔案。當然,如果有強迫症或者公司裝置不夠,那麼還是合併靜態庫檔案吧。