iOS 靜態(tài)庫開發(fā)(轉(zhuǎn))

這是一篇好文章,原帖地址


簡介

在企業(yè)開發(fā)中,一些核心技術(shù)或者常用框架,出于安全性和穩(wěn)定性的考慮,不想被外界知道,所以會把核心代碼打包成靜態(tài)庫,只暴露頭文件給程序員使用(比如:友盟、百度地圖等第三方的sdk)

靜態(tài)庫和動態(tài)庫的存在形式

靜態(tài)庫:.a 和 .framework

動態(tài)庫:.dylib 和 .framework

靜態(tài)庫和動態(tài)庫的區(qū)別

靜態(tài)庫:鏈接時,靜態(tài)庫會被完整地復制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝

動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個程序共用,節(jié)省內(nèi)存

注意:項目中如果使用了動態(tài)庫,會蘋果拒接

靜態(tài)庫文件的版本(4種)

真機-Debug版本

真機-Release版本

模擬器-Debug版本

模擬器-Release版本

Debug(調(diào)試)版本

含完整的符號信息,以方便調(diào)試

不會對代碼進行優(yōu)化

Release(發(fā)布)版本

不會包含完整的符號信息

的執(zhí)行代碼是進行過優(yōu)化的

的大小會比Debug版本的略小

在執(zhí)行速度方面,Release版本會更快些(但不意味著會有顯著的提升)

所以我們一般開發(fā)中都打包Release(發(fā)布)版本,提供外界

設備的CPU架構(gòu)簡介(補充知識)

模擬器:

4s~5 : i386

5s~6plus : x86_64

真機:

3gs~4s : armv7

5~5c : armv7s (靜態(tài)庫只要支持了armv7,就可以跑在armv7s的架構(gòu)上)

5s~6plus : arm64

制作靜態(tài)庫 – Debug版

1.新建項目

2.添加靜態(tài)庫并命名

3.需要打包到進靜態(tài)庫的代碼,放在這個文件夾內(nèi)

4.重新創(chuàng)建測試類(HSCalculate),提供外界計算兩個數(shù)和的方法

HSCalculate.h

Objective-C

1

2

3@interfaceHSCalculate: NSObject

+(NSInteger)sumNum1:(NSInteger)num1num2:(NSInteger)num2;

@end

HSCalculate.m

Objective-C

1

2

3

4

5

6

7#import "HSCalculate.h"

@implementationHSCalculate

+(NSInteger)sumWithNum1:(NSInteger)num1num2:(NSInteger)num2

{

returnnum1+num2;

}

@end

5.需要暴露給外界的文件(接口)

6.打包支持模擬器和真機的靜態(tài)庫(分別選擇真機和模擬器運行,就會生成對應的靜態(tài)庫)

7.查看打包好的靜態(tài)庫

兩個文件夾,里面的.a文件就是打包好的靜態(tài)庫

Debug-iphoneos : 真機

Debug-iphonesimulator:模擬器

可用下面命令查看靜態(tài)庫支持的cpu架構(gòu)(可查看上面描述的cpu架構(gòu)類型)

Objective-C

1

lipo-infoxxx.a

分別查看打包好的模擬器與真機的靜態(tài)庫所支持的cpu架構(gòu)

你會發(fā)現(xiàn)模擬器的靜態(tài)庫少了4s~5 : i386架構(gòu)

原因:

下面Debug:Yes表示只編譯選中模擬器對應的架構(gòu),No則為編譯所有模擬器支持的cup架構(gòu)(Debug的Yes狀態(tài)改為No即可)

修改完后,重新編譯:

8.在本項目對該靜態(tài)庫進行調(diào)試,ViewController.m導入HSCalculate.h,測試運行,你會發(fā)現(xiàn)報錯了

Objective-C

1

2

3

4

5

6

7

8

9

10

11#import "ViewController.h"

#import "HSCalculate.h"

@interfaceViewController()

@end

@implementationViewController

-(void)viewDidLoad{

[superviewDidLoad];

NSIntegerresult=[HSCalculatesumWithNum1:23num2:25];

NSLog(@"result: %d",result);

}

@end

報錯:

原因:

需要導入靜態(tài)庫(編譯即可運行成功)

9.同時支持真機與模擬器的靜態(tài)庫(需要合并)

真機和模擬器的靜態(tài)庫,是不一樣的,不能同時適用在真機和模擬器上,但要滿足這要求的話,要對編譯好的兩個靜態(tài)庫進行合并

合并好壞:

好:開發(fā)過程中既可以在真機上調(diào)試,也可以在模擬器上調(diào)試

壞:如果靜態(tài)庫太大,合并打包后,會非常大,因此很多第三方的靜態(tài)庫的.a是區(qū)分版本的

合并產(chǎn)生新的靜態(tài)庫:

Objective-C

1

lipo-createDebug-iphoneos/xxx.aDebug-iphonesimulator/xxx.a-outputxxx.a

10.把合并好的靜態(tài)庫和外界訪問的文件拉入到新工程,即可使用(inc文件自己建立的)

新建工程測試:

制作靜態(tài)庫 – Release版

跟Debug版步驟一樣,只不過在編譯時,改下面的選項即可

制作靜態(tài)庫 – .framework版

步驟跟制作.a靜態(tài)庫,基本一致,但要注意的下面幾點:

1.選擇framework

2.編譯時,默認制作成動態(tài)庫,要在下面選擇

3.合并靜態(tài)庫時,是選.framework文件里的libstaticlib文件

合并:

刪除libstaticlib,libCalculateTool拉入libstaticlib.framework項目中,libstaticlib.framework靜態(tài)庫制作完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容