iOS開發(fā)中靜態(tài)庫制作 之.a靜態(tài)庫制作及使用篇

iOS開發(fā)中靜態(tài)庫之".a靜態(tài)庫"的制作及使用篇

一.庫的簡(jiǎn)介

1.什么是庫?

  • 庫是程序代碼的集合,是共享程序代碼的一種方式

2.庫的類型?

  • 根據(jù)源代碼的公開情況,庫可以分為2種類型
  • 開源庫
    • 公開源代碼,能看到具體實(shí)現(xiàn)
    • 如SDWebImage, AFNetworking
  • 閉源庫
    • 不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到具體實(shí)現(xiàn)
    • 主要分為: 靜態(tài)庫,動(dòng)態(tài)庫

3.靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別?

1.靜態(tài)庫和動(dòng)態(tài)庫的存在形式上的區(qū)別

  • 靜態(tài)庫
    • .a
    • .framework
  • 動(dòng)態(tài)庫
    • .dylib

      • 在Xcode 8里面,看到后綴為.tbd的庫,它的本質(zhì)都是.dylib文件
    • .framework

2.靜態(tài)庫和動(dòng)態(tài)庫在使用上的區(qū)別

  • 靜態(tài)庫
    • 鏈接時(shí),靜態(tài)庫會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝
  • 動(dòng)態(tài)庫
    • 鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)的加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存

二.靜態(tài)庫的應(yīng)用場(chǎng)景

  • 制作SDK - 軟件開發(fā)工具包(Software Development Kit)
    • 如"百度地圖",它想讓開發(fā)者在應(yīng)用程序中集成百度地圖,但是百度又不想公布自己的技術(shù)實(shí)現(xiàn),那怎么辦?
    • 百度將自己的核心代碼編譯成靜態(tài)庫,對(duì)外暴露統(tǒng)一的接口,開發(fā)者集成靜態(tài)庫,并且調(diào)用靜態(tài)庫即可集成
  • 公司在開發(fā)項(xiàng)目時(shí)的核心代碼
    • 公司一般在開發(fā)一個(gè)項(xiàng)目時(shí),肯定有一部分代碼是核心代碼
    • 如果任何人都可以拿到這個(gè)核心代碼,那么一旦有人離職,公司的核心代碼就會(huì)被泄漏,那么該如何防止這種情況的發(fā)生?
    • 公司一般都會(huì)抽出一部分核心團(tuán)隊(duì)成員,專門開發(fā)這部分核心代碼,開發(fā)完成后,將核心代碼編譯成靜態(tài)庫給其他的程序員調(diào)用,核心成員一般很少會(huì)離職的,從而非核心成員即使離職也無法帶走公司的核心代碼

三.靜態(tài)庫 之 .a

1.如何創(chuàng)建.a靜態(tài)庫?

1.創(chuàng)建工程,選擇Cocoa Touch Static Library創(chuàng)建.a靜態(tài)庫

創(chuàng)建工程

注意

  • 它只支持OC,不支持swift

2.創(chuàng)建項(xiàng)目,例如創(chuàng)建一個(gè)數(shù)學(xué)工具類MTYMathTools

MTYMathTools.h文件

#import <Foundation/Foundation.h>

@interface MTYMathTools : NSObject

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

@end

MTYMathTools.m文件

@implementation MTYMathTools

+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
{
    return num1 + num2;
}

@end

3.把MTYMathTools工具類編譯成.a靜態(tài)庫

  • 實(shí)際上就是把.m文件編譯成.a靜態(tài)庫
  • 頭文件(.h)我們要暴露出去
  • cmd + B編譯一下,得到.a文件如下圖所示
01.a文件
  • 右鍵Show in Finder,這時(shí)我們會(huì)在文件夾內(nèi)發(fā)現(xiàn)一個(gè).a文件,但是光有.a文件還不行,還需要把頭文件暴露出去,否則別人拿到是無法使用的
  • 如何暴露頭文件?
    • 第一種可以直接copy過去,但是一般不會(huì)這么做
    • 第二種工程內(nèi)配置
02.a文件
- 把之前生成的.a文件刪除,重新`cmd + B`編譯一下,就會(huì)發(fā)現(xiàn),文件夾內(nèi)出現(xiàn)了我們要暴露的頭文件
03.a文件
- 這樣其他人就可以使用我們的.a靜態(tài)庫了

2.測(cè)試

1.可以把剛才生成的.a及.h文件放在一個(gè)MTYMathTools的文件夾內(nèi)

2.創(chuàng)建工程,這里用swift工程測(cè)試,因?yàn)槲覀兊?a靜態(tài)庫是OC創(chuàng)建的,swift都能使用的話,OC肯定也沒問題

3.文件夾拖入工程內(nèi),創(chuàng)建橋接文件,并配置橋接文件

04.a文件

4.cmd + B編譯一下,看是否編譯通過,如果報(bào)錯(cuò),可能是橋接文件沒有配置正確,仔細(xì)檢查一下.

5.編譯通過后,在ViewController.swift中測(cè)試一下,點(diǎn)擊控制器的view,看是否能打印

  • 模擬器選擇iPhone 7 (10.1)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print(MTYMathTools.sumNum1(20, num2: 20))
}

打印結(jié)果顯示: 40, 說明我們的靜態(tài)庫可以被使用

  • 這樣別人即可以使用我們的靜態(tài)庫,又不會(huì)知道我們的具體實(shí)現(xiàn)(當(dāng)然這個(gè)例子應(yīng)該是可以被猜出來的~~)

3.存在的BUG

  • 如果你認(rèn)為上面就算把.a靜態(tài)庫創(chuàng)建完了,那么你高興的太早了??
  • 它還存在bug
  • 上面我們使用的模擬器是iPhone 7,下面我們切換下模擬器,使用iPhone 6測(cè)試一下,cmd + B編譯一下即可,發(fā)現(xiàn)編譯通過,沒有問題
  • 接著換模擬器,iPhone 5s,仍舊編譯通過
  • 接著換,iPhone 5,編譯后發(fā)現(xiàn)報(bào)錯(cuò)了(每編譯一次.a文件都是重新生成的),報(bào)錯(cuò)信息如下:
05.a文件
  • 接著換,真機(jī),編譯后發(fā)仍舊報(bào)錯(cuò),報(bào)錯(cuò)信息如下:
06.a文件
  • 以上測(cè)試,我們發(fā)現(xiàn)結(jié)果:
    • 我們的.a文件目前只支持iPhone 5s及其后面的模擬器設(shè)備
    • iPhone 5及以前的設(shè)備并不支持
    • 真機(jī)設(shè)備不支持
  • 為什么?

4.BUG分析

1.首先每一個(gè)設(shè)備都有自己的CPU

2.每一個(gè)靜態(tài)庫都有自己支持的CPU架構(gòu)和不支持的CPU架構(gòu)

3.如何查看靜態(tài)庫支持哪些CPU架構(gòu)

  • 命令行: lipo -info 靜態(tài)庫名稱
  • 終端執(zhí)行命令,打印結(jié)果:
input file libMTYMathTools.a is not a fat file
Non-fat file: libMTYMathTools.a is architecture: x86_64

2.下面總結(jié)一些常見模擬器&真機(jī)所使用的CPU架構(gòu)

模擬器使用的CPU架構(gòu)

  • iPhone 4s ~ iPhone 5 : i386
  • iPhone 5s ~ iPhone 7plus : x86_64

真機(jī)設(shè)備CPU架構(gòu)

  • iPhone 3gs ~ iPhone 4s : armv7
  • iPhone 5 ~ iPhone 5c : armv7s

3.所以我們上面的.a靜態(tài)庫只支持x86_64的CPU架構(gòu)(因?yàn)槲覀儺?dāng)時(shí)是在iPhone 7模擬器上編譯的),其他設(shè)備運(yùn)行時(shí)都會(huì)報(bào)錯(cuò)

5.解決BUG

解決坑1: 模擬器

  • 我們發(fā)現(xiàn),上面我們創(chuàng)建的.a靜態(tài)庫只支持x86_64的CPU架構(gòu),就是說只支持iPhone 5s后的模擬器設(shè)備
  • 下面我們想讓他也支持其他的模擬器設(shè)備,及支持i386CPU架構(gòu),怎么辦?
  • 有的人可能會(huì)直接選擇iPhone 5模擬器,編譯一下,但是那樣是支持i386了,但是不支持x86_64了
  • 正確做法:
07.a文件
  • Build Active Architecture Only中的Debug如果為YES,就是說只能調(diào)試當(dāng)前活躍的架構(gòu),我們當(dāng)前選中的即是活躍的,所以設(shè)置為No即可
  • 終端測(cè)試打印
Architectures in the fat file: libMTYMathTools.a are: i386 x86_64
  • 但是我們上面雖然解決了模擬器的bug,但是在真機(jī)設(shè)備運(yùn)行時(shí)還是報(bào)錯(cuò).

解決坑2: 真機(jī)

  • 選擇真機(jī)編譯一下
  • 發(fā)現(xiàn)原文件夾中多了一個(gè)文件夾,即Debug-iphoneos,這個(gè)就是真機(jī)運(yùn)行時(shí)生成的.a靜態(tài)庫
  • 終端打印一下,看它支持哪些CPU架構(gòu)
Architectures in the fat file: libMTYMathTools.a are: armv7 arm64 
  • 發(fā)現(xiàn)支持armv7 和 arm64,支持armv7的話,那么在armv7s上也能跑,現(xiàn)在很少有人專門配置armv7s,因?yàn)閕Phone 5和5c現(xiàn)在很少見了

  • 所以現(xiàn)在最好的做法是把我們上面支持模擬器的.a文件和這里支持真機(jī)的.a文件綜合一下.

  • 如何合并兩個(gè)靜態(tài)庫?

    • 終端命令: lipo -create 靜態(tài)庫1名 靜態(tài)庫2名 -output 新靜態(tài)庫名稱
  • 終端執(zhí)行完成后,不出意外的話會(huì)在文件夾內(nèi)生成一個(gè)新靜態(tài)庫,我這里就仍叫做libMTYMathTools.a

  • 終端檢查一下它支持哪些cpu架構(gòu)

Architectures in the fat file: libMTYMathTools.a are: armv7 i386 x86_64 arm64 
  • 發(fā)現(xiàn)現(xiàn)在我們這個(gè)新的.a靜態(tài)庫已經(jīng)支持所有模擬器的設(shè)備和真機(jī)設(shè)備的CPU架構(gòu)了
  • 大功告成!

點(diǎn)擊查看 原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳞青,一起剝皮案震驚了整個(gè)濱河市垦江,隨后出現(xiàn)的幾起案子义矛,更是在濱河造成了極大的恐慌嗦篱,老刑警劉巖中捆,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件监氢,死亡現(xiàn)場(chǎng)離奇詭異诫隅,居然都是意外死亡愈捅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門翩腐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟款,“玉大人,你說我怎么就攤上這事茂卦『问玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵等龙,是天一觀的道長(zhǎng)处渣。 經(jīng)常有香客問我,道長(zhǎng)蛛砰,這世上最難降的妖魔是什么罐栈? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泥畅,結(jié)果婚禮上荠诬,老公的妹妹穿的比我還像新娘。我一直安慰自己位仁,他們只是感情好柑贞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聂抢,像睡著了一般钧嘶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上琳疏,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天有决,我揣著相機(jī)與錄音,去河邊找鬼空盼。 笑死疮薇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的我注。 我是一名探鬼主播按咒,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼但骨!你這毒婦竟也來了励七?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤奔缠,失蹤者是張志新(化名)和其女友劉穎掠抬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體校哎,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡两波,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瞳步,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腰奋。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劣坊,到底是詐尸還是另有隱情嘀倒,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布局冰,位于F島的核電站测蘑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏康二。R本人自食惡果不足惜碳胳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沫勿。 院中可真熱鬧固逗,春花似錦、人聲如沸藕帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洽故。三九已至贝攒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間时甚,已是汗流浹背隘弊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荒适,地道東北人梨熙。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刀诬,于是被迫代替她去往敵國(guó)和親咽扇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 1陕壹、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評(píng)論 3 119
  • 我是在2016年12月7號(hào)報(bào)名考駕照的糠馆,在2018年2月14號(hào)那天才拿到駕照嘶伟,也許這就是上天送給我的情人節(jié)禮物,前...
    小縣城生活日記閱讀 1,073評(píng)論 17 13
  • 現(xiàn)在不少網(wǎng)盤廠商的不斷倒閉绊袋,讓很多人對(duì)網(wǎng)盤市場(chǎng)不再那么信心滿滿,而是有點(diǎn)擔(dān)心了铸鹰,至于我們大家耳熟能詳?shù)陌俣染W(wǎng)盤癌别,不...
    貴的友誼閱讀 403評(píng)論 0 0
  • 春風(fēng)送暖姓建,桃紅柳綠, 在四月的第一個(gè)早晨缤苫, 送上我真誠(chéng)的祝福: 祝大家心情愉快速兔,身體健康, 好運(yùn)常伴活玲,幸富凉罚快樂!
    知行路上閱讀 277評(píng)論 0 0
  • 01/ 十一月份的北方已經(jīng)進(jìn)入了大冬季舒憾,屋內(nèi)暖氣送的極其的旺镀钓,屋外寒風(fēng)蕭瑟,落葉散落了滿地镀迂,北方的冬季就是這樣蕭瑟...
    治愈里閱讀 466評(píng)論 1 2