iOS中Framework和.a的打包及使用

原文
iOS中,Framework和.a的打包及使用

最近在做一個小項目,需要給客戶一個demo測試,有一部分核心代碼暫時不想讓客戶知道,就想到了打包成framework或.a庫蜡励。庫有兩種:

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

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

  • .a文件肯定是靜態(tài)庫凉倚,. tbd肯定是動態(tài)庫嫂沉,.framework可能是靜態(tài)庫也可能是動態(tài)庫
  • 靜態(tài)庫在鏈接時趟章,會被完整的復(fù)制到可執(zhí)行文件中,如果多個App都使用了同一個靜態(tài)庫,那么每個App都會拷貝一份,缺點是浪費內(nèi)存。類似于定義一個基本變量毯盈,使用該基本變量是是新復(fù)制了一份數(shù)據(jù)基公,而不是原來定義的骂租;
  • 動態(tài)庫不會復(fù)制,只有一份谤饭,程序運行時動態(tài)加載到內(nèi)存中闺兢,系統(tǒng)只會加載一次讲岁,多個程序共用一份备籽,節(jié)約了內(nèi)存珠闰。類似于使用變量的內(nèi)存地址一樣挣轨,使用的是同一個變量摩幔;
  • 在iOS8.0以后蘋果開放了動態(tài)加載. tbd的接口艰额,用于掛載. tbd動態(tài)庫,項目中也可以使用了自己定義的動態(tài)庫。

總結(jié):
靜態(tài)庫:
1.編譯時將程序放進(jìn)進(jìn)可執(zhí)行程序
2.會產(chǎn)生多分副本
3.不依賴程序運行
動態(tài)庫:
1.程序運行時羔杨,加載時才去動態(tài)庫找函數(shù)
2.多進(jìn)程共享
3.依賴程序運行

使用靜態(tài)庫的好處

  • 模塊化卵皂,分工合作
  • 避免少量改動經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
  • 也可以重用寻仗,注意不是共享使用

使用動態(tài)庫的好處

  • 使用動態(tài)庫俗扇,可以將最終可執(zhí)行文件體積縮小
  • 使用動態(tài)庫狮杨,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件陷遮,節(jié)省資源
  • 使用動態(tài)庫吧慢,可以不重新編譯連接可執(zhí)行程序的前提下火架,更新動態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。

靜態(tài)庫的使用場景

  • 保護(hù)自己的核心代碼来屠,自己不想別人看到的部分
  • 將MRC的項目打包成靜態(tài)庫,可以在ARC下直接使用劫恒,不需要在轉(zhuǎn)換

iOS設(shè)備的CPU架構(gòu)
模擬器

  • 4S-5:i386
  • 5s-7P:x86_64

真機(jī)

  • armv6:iPhone - iPhone3G
  • armv7:iPhone 3Gs,4,4S,iPad,iPad2
  • armv7s: iPhone 5篮绿、iPhone 5c <靜態(tài)庫只要支持了armv7,就可以在armv7s的架構(gòu)上運行>
  • arm64:iPhone 5s思灰、iPhone 6电湘、iPhone 6 Plus强胰、iPhone 6s吗铐、iPhone 6s Plus歹啼、iPad Air、iPad Air2啊央、iPad mini2坎炼、iPad mini3

沒有armv64

下面言歸正傳孙乖,做點正事

.a靜態(tài)庫

1.創(chuàng)建一個新的工程店归,選擇下面這個模板:

a1.jpeg

完成

a2.jpeg

2.我這里就在Test操作了(親空入,你打包.a的時候,可以刪除默認(rèn)文件屈溉,拉入自己想加入的任何文件)

a3.jpeg
a4.jpeg

下面在創(chuàng)建一個Person類

a5.jpeg
a6.jpeg

3.選擇需要公開的頭文件

  • 添加頭文件
a7.gif

4.修改配置

  • Build Active Architecture Only修改為NO好啰,否則生成的靜態(tài)庫就只支持當(dāng)前選擇設(shè)備的架構(gòu)。
a8.jpeg
  • iOS Deployment Target 最盅,靜態(tài)庫需要支持版本
a9.jpeg
  • Mach-O Type更改成Static Library,.a默認(rèn)就是Static Library,這一步可以省略
a10.jpeg

5.編譯
選擇Generic iOS Device任意一個模擬器各編譯一次,完成后,在工程的Products文件夾下的.a文件從紅色編程了黑色养叛。編譯成功伞芹,然后Show in Finder坛增。

a11.gif

可以看到真機(jī)與模擬器都生成了.a期奔。里面都有有我選擇公開的頭文件
這個時候,可以用命令lipo -info 靜態(tài)庫名字來看下垛吗,支持的iOS的CPU框架

a12.gif
  • Debug-iphoneos里面支持armv7、arm64,屬于真機(jī),用到模擬器就會報錯
  • Debug-iphonesimulator里面支持i386祝蝠、x86_64儡嘶,屬于模擬器窜骄,用到真機(jī)會報錯

6.合并靜態(tài)庫-讓模擬器和真機(jī)使用一個靜態(tài)庫
命令如下:
lipo -create第一個.a文件的絕對路徑 第二個.a文件的絕對路徑 -output 最終的.a文件路徑

a13.gif

這個生成的libTest.a,就是支持真機(jī)和模擬器的靜態(tài)庫了。創(chuàng)建一個文件夾,把.a和頭文件拖進(jìn)去,這個文件夾就是我們所需要的钠导。

a14.gif

為了開發(fā)方便,我們可以使用生成的通用靜態(tài)庫责掏,但是上線的時候只導(dǎo)入真機(jī)的湃望,這樣工程的體積也會小一些。

使用.a靜態(tài)庫

新建一個工程瞳浦,把我們的靜態(tài)庫拖進(jìn)去废士,導(dǎo)入頭文件官硝。

a15.jpeg

.framework靜態(tài)庫

1.Xcode創(chuàng)建一個新工程,需要選擇這個Cocoa Touch Framework這個模板

  • 創(chuàng)建完成后的framework.hInfn.plist不要刪除(創(chuàng)建framework的時候命名不要用framework命名傻咖,否則在使用這個framework的時候會報錯)
framework1.png

2.創(chuàng)建Person卿操,也是輸入名字和年齡孙援,和.a一樣

framework2.jpeg
framework3.jpeg
注意事項:
  • 如果打包的文件中有設(shè)置圖片的地方窥摄,如果還是通過[UIImage imageNamed:]的方式設(shè)置础淤,圖片可能不會顯示。
  • 圖片最好單獨打包一個bundle莹菱,這個時候設(shè)置圖片的方式為:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//拿到路徑
NSString *path = [[NSBundle mainBundle] pathForResource:@"bundle" ofType:@"bundle"];
//設(shè)置圖片
UIImage *image = [UIImage imageNamed:@"delete" inBundle:[NSBundle bundleWithPath:path] compatibleWithTraitCollection:nil];

 [button setImage:image forState:UIControlStateNormal];

3.選擇要公開的頭文件
這里主要是讓使用者知道有哪些方法和頭文件可以使用

  • 第一種添加頭文件的方式吱瘩,把需要公開的頭文件添加到public里面
framework4.jpeg
  • 第二種添加頭文件的方式使碾。在右側(cè)的選擇中,選擇Public
framework5.gif

注意拘鞋。要在這個文件中引入需要公開的頭文件

framework6.jpeg

這里有一個注意點盆色,公開的頭文件中祟剔,#import的其他類也要公開,添加到public中宣旱,如果不想公開叛薯,就在頭文件用用@class的方式,在對應(yīng)的.m中用#import方式

4.修改配置

  • Build Active Architecture Only修改為NO组力,否則生成的靜態(tài)庫就只支持當(dāng)前選擇設(shè)備的架構(gòu)抖拴。

    framework7.jpeg
  • Mach-O Type城舞,因為動態(tài)庫也可以是以framework形式存在,所以需要設(shè)置脱柱,否則默認(rèn)打出來的是動態(tài)庫拉馋。
    靜態(tài)庫Static Library(默認(rèn)為Dynamic Library

framework8.jpeg
  • iOS Deployment Target 煌茴,靜態(tài)庫需要支持版本
framework9.jpeg

5.編譯
選擇Generic iOS Device任意一個模擬器各編譯一次,完成后矩乐,在工程的Products文件夾下的.framework文件從紅色編程了黑色散罕。編譯成功,然后Show in Finder职抡。

framework10.gif

可以看到真機(jī)與模擬器都生成了.framework误甚。里面都有我們選擇公開的頭文件
這個時候,可以用命令lipo -info framework靜態(tài)庫文件下二進(jìn)制文件的名字來看下蹄胰,支持的iOS的CPU框架

framework11.gif
  • Debug-iphoneos里面支持armv7裕寨、arm64,屬于真機(jī)派继,用到模擬器就會報錯
  • Debug-iphonesimulator里面支持i386、x86_64庆猫,屬于模擬器绅络,用到真機(jī)會報錯

6.合并靜態(tài)庫-讓模擬器和真機(jī)使用一個靜態(tài)庫
命令如下:
lipo -create第一個framework文件下二進(jìn)制文件的絕對路徑 第二個framework文件下二進(jìn)制文件的絕對路徑 -output 最終的二進(jìn)制文件路徑

framework12.gif

將合成的二進(jìn)制文件拖進(jìn)任何一個framework恩急,替換掉原來的,然后把這個新的framework拖進(jìn)項目就可以使用了

使用framework靜態(tài)庫

新建一個工程此叠,把我們的靜態(tài)庫拖進(jìn)去随珠,導(dǎo)入頭文件。然后調(diào)用Person中的方法茸歧。

framework13.jpeg

如果靜態(tài)庫中有Category類显沈,就要在使用靜態(tài)庫項目的配置中找到主工程的 target --Build Setting--Linking--更改其 Other Linker Flags為:-ObjC-all_load 即可。
如果創(chuàng)建的framework類中使用了.tbd,則項目中也要導(dǎo)入.tbd動態(tài)庫

參考文章:
iOS中,Framework和.a的打包及使用
靜態(tài)庫與動態(tài)庫的區(qū)別以及framework的使用
C語言靜態(tài)庫與動態(tài)庫的區(qū)別的深入分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遂唧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纹烹,老刑警劉巖召边,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧熙,死亡現(xiàn)場離奇詭異,居然都是意外死亡音念,警方通過查閱死者的電腦和手機(jī)躏敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門件余,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啼器,你說我怎么就攤上這事》厥” “怎么了更哄?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵成翩,是天一觀的道長。 經(jīng)常有香客問我栅炒,道長,這世上最難降的妖魔是什么赢赊? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任释移,我火速辦了婚禮,結(jié)果婚禮上涩蜘,老公的妹妹穿的比我還像新娘熏纯。我一直安慰自己,他們只是感情好樟澜,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秩贰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吭服。 梳的紋絲不亂的頭發(fā)上蝗罗,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音沼琉,去河邊找鬼桩匪。 笑死,一個胖子當(dāng)著我的面吹牛闺骚,可吹牛的內(nèi)容都是我干的妆档。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胸梆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碰镜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绪颖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菠发,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贺嫂,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年糜俗,在試婚紗的時候發(fā)現(xiàn)自己被綠了悠抹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楔敌,死狀恐怖卵凑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺卢,我是刑警寧澤象对,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布勒魔,位于F島的核電站,受9級特大地震影響冠绢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埃跷,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弥雹。 院中可真熱鬧,春花似錦贸诚、人聲如沸厕吉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项钮。三九已至,卻和暖如春烁巫,著一層夾襖步出監(jiān)牢的瞬間署隘,已是汗流浹背亚隙。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留诊霹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓畅哑,卻偏偏與公主長得像荠呐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泥张,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 最近在做一個小項目,需要給客戶一個demo測試,有一部分核心代碼暫時不想讓客戶知道,就想到了打包成framewor...
    carpond閱讀 13,515評論 19 62
  • 靜態(tài)庫與動態(tài)庫的區(qū)別 首先來看什么是庫钞钙,庫(Library)說白了就是一段編譯好的二進(jìn)制代碼鳄橘,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,931評論 3 42
  • 從七月開始恢復(fù)每周的閱讀瘫怜,選擇精力管理也是合適的開始本刽。總覺得自己時間不夠用暗挑,拖延癥又日漸嚴(yán)重,看過一些時間管理的書...
    鈴蘭小語閱讀 737評論 2 0
  • 忙碌的時候 會忘記表達(dá) 最近 由于忙碌 我不再讀書 不再寫字 只是專注的忙碌 忙碌些應(yīng)該忙碌的事情 ...
    陳列達(dá)杰閱讀 247評論 0 0
  • 這本書估計還剩不到100頁了,今天下班回去就可以看完蝙寨,這個系列明天再寫一篇就結(jié)束了嗤瞎。 昨天下班就去踢球,從7點30...
    聞舒閱讀 283評論 0 0