簡介
在企業(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)庫會被完整地復(fù)制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝
動態(tài)庫:鏈接時不復(fù)制坷衍,程序運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存寝优,供程序調(diào)用,系統(tǒng)只加載一次惫叛,多個程序共用倡勇,節(jié)省內(nèi)存
注意:項目中如果使用了動態(tài)庫,會蘋果拒接
靜態(tài)庫文件的版本(4種)
真機(jī)-Debug版本
真機(jī)-Release版本
模擬器-Debug版本
模擬器-Release版本
Debug(調(diào)試)版本
1.含完整的符號信息嘉涌,以方便調(diào)試
? ?2.不會對代碼進(jìn)行優(yōu)化
Release(發(fā)布)版本
1.不會包含完整的符號信息
? ?2.的執(zhí)行代碼是進(jìn)行過優(yōu)化的
? ?3.的大小會比Debug版本的略小
? ?4.在執(zhí)行速度方面妻熊,Release版本會更快些(但不意味著會有顯著的提升)
所以我們一般開發(fā)中都打包Release(發(fā)布)版本,提供外界
設(shè)備的CPU架構(gòu)簡介(補(bǔ)充知識)
模擬器:
4s~5 : i386
5s~6plus : x86_64
真機(jī):
3gs~4s : armv7
5~5c : armv7s (靜態(tài)庫只要支持了armv7仑最,就可以跑在armv7s的架構(gòu)上)
5s~6plus : arm64
制作靜態(tài)庫 - Debug版
1.新建項目
2.添加靜態(tài)庫并命名
3.需要打包到進(jìn)靜態(tài)庫的代碼扔役,放在這個文件夾內(nèi)
4.重新創(chuàng)建測試類(HSCalculate),提供外界計算兩個數(shù)和的方法
HSCalculate.h
@interface HSCalculate : NSObject
+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
@end
HSCalculate.m
#import "HSCalculate.h"
@implementation HSCalculate
+ (NSInteger)sumWithNum1:(NSInteger)num1 num2:(NSInteger)num2
{
? ?return num1 + num2;
}
@end
5.需要暴露給外界的文件(接口)
6.打包支持模擬器和真機(jī)的靜態(tài)庫(分別選擇真機(jī)和模擬器運(yùn)行警医,就會生成對應(yīng)的靜態(tài)庫)
7.查看打包好的靜態(tài)庫
兩個文件夾亿胸,里面的.a文件就是打包好的靜態(tài)庫
Debug-iphoneos : 真機(jī)
Debug-iphonesimulator:模擬器
可用下面命令查看靜態(tài)庫支持的cpu架構(gòu)(可查看上面描述的cpu架構(gòu)類型)
lipo -info xxx.a
分別查看打包好的模擬器與真機(jī)的靜態(tài)庫所支持的cpu架構(gòu)
你會發(fā)現(xiàn)模擬器的靜態(tài)庫少了4s~5 : i386架構(gòu)
原因:
下面Debug:Yes表示只編譯選中模擬器對應(yīng)的架構(gòu),No則為編譯所有模擬器支持的cup架構(gòu)(Debug的Yes狀態(tài)改為No即可)
修改完后预皇,重新編譯:
8.在本項目對該靜態(tài)庫進(jìn)行調(diào)試侈玄,ViewController.m導(dǎo)入HSCalculate.h,測試運(yùn)行吟温,你會發(fā)現(xiàn)報錯了
#import "ViewController.h"
#import "HSCalculate.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
? ?[super viewDidLoad];
? ?NSInteger result = [HSCalculate sumWithNum1:23 num2:25];
? ?NSLog(@"result: %d", result);
}
@end
報錯:
原因:
需要導(dǎo)入靜態(tài)庫(編譯即可運(yùn)行成功)
9.同時支持真機(jī)與模擬器的靜態(tài)庫(需要合并)
真機(jī)和模擬器的靜態(tài)庫序仙,是不一樣的,不能同時適用在真機(jī)和模擬器上鲁豪,但要滿足這要求的話潘悼,要對編譯好的兩個靜態(tài)庫進(jìn)行合并
合并好壞:
好:開發(fā)過程中既可以在真機(jī)上調(diào)試,也可以在模擬器上調(diào)試
壞:如果靜態(tài)庫太大爬橡,合并打包后治唤,會非常大,因此很多第三方的靜態(tài)庫的.a是區(qū)分版本的
合并產(chǎn)生新的靜態(tài)庫:
lipo -create Debug-iphoneos/xxx.a Debug-iphonesimulator/xxx.a -output xxx.a
10.把合并好的靜態(tài)庫和外界訪問的文件拉入到新工程糙申,即可使用(inc文件自己建立的)
Snip20150830_26.png
新建工程測試:
Snip20150830_28.png
制作靜態(tài)庫 - Release版
跟Debug版步驟一樣宾添,只不過在編譯時,改下面的選項即可
制作靜態(tài)庫 - .framework版
步驟跟制作.a靜態(tài)庫,基本一致辞槐,但要注意的下面幾點(diǎn):
1.選擇framework
Snip20150830_32.png
2.編譯時掷漱,默認(rèn)制作成動態(tài)庫,要在下面選擇
Snip20150830_33.png
3.合并靜態(tài)庫時榄檬,是選.framework文件里的libstaticlib文件
合并:
刪除libstaticlib卜范,libCalculateTool拉入libstaticlib.framework項目中,libstaticlib.framework靜態(tài)庫制作完成