在項目開發的過程當中,常用靜態庫文件。例如兩個公司之間業務交流,不可能把源代碼都發送給另外一個公司,這時候將私密內容打包成靜態庫,別人只能調用接口,而不能知道其中實現的細節。python
簡介:app
庫是一些沒有main函數的程序代碼集合。除了靜態庫,還有動態連接庫,他們之間的區別是:靜態庫能夠編譯到咱們的執行代碼中,應用程序能夠在沒有靜態庫的環境中運行;動態庫不能編譯到咱們的執行代碼中,應用程序必須在有連接庫文件的環境下運行。
iphone
建立靜態庫的步驟以下所示,
函數
一、建立Static Library,新建->Project,選擇Static Library,如圖,ui
點擊Next,我將Static Library項目名稱命名爲TimeDate,由於這是我用於處理時間和日期的靜態庫工程,spa
二、靜態庫文件功能的實現細節code
建立了靜態庫Static Library項目以後,Xcode自動爲咱們建立了TimeDate.h/.m文件,以下圖所示,orm
這時候咱們須要在這裏面填充一些細節,這裏,我想要實現的功能就是將時間戳NSTimeInterval轉換成NSString的功能,那麼代碼的細節以下所示,接口
TimeDate.h文件
ip
@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,固然這樣確定有考慮不全面的地方,這不是本篇博客的中心內容,讀者能夠忽略;若是有好的建議請告訴我。
三、編譯項目,生成對應的靜態庫.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靜態庫文件。
四、合併靜態庫
針對真機和模擬器的靜態庫文件只能在一個平臺下面使用,好在咱們能夠將真機和模擬器上面的靜態庫文件合併成一個在真機和模擬器均可以使用的靜態庫文件,經過在終端輸入命令便可完成該目的,
完整的命令就是:
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靜態庫文件,它能夠再真機和模擬器上面同時使用。
五、使用靜態庫文件,
這時候咱們就可使用本身建立、編譯生成的靜態庫文件了,將TimeDate.h文件和桌面上面的libTimeDate.a文件拖到想要使用的項目中,以下圖的目錄結構,
爲了方便,我直接在AppDelegate中使用建立的靜態庫文件了,代碼以下,
AppDelegate.m文件
#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真機程序,因此能夠選擇不合並靜態庫,直接使用真機編譯生成的靜態庫文件進行開發,沒有必要爲了兼容模擬器而合併靜態庫文件。固然,若是有強迫症或者公司設備不夠,那麼仍是合併靜態庫文件吧。
感想:很早就想總結一下靜態庫的東西,可是感受沒有必要,也不知道怎麼系統的總結。最近項目中,發現老大對於項目依賴關係處理的很牛逼,我很羨慕。若是我想達到他那樣的水平,必須從頭開始好好了解,而這第一步基本就是靜態庫方面的東西,因此必須走好第一步。這篇博客也算是我寫項目依賴關係博客的前奏,後面我會更加深刻的記錄我本身對於項目管理方面的一些理解,但願對讀者有所幫助。