Xcode上手之庫职祷、框架、包

Xcode技巧系列:http://www.reibang.com/notebooks/7639304/latest

在編程的時候届囚,我們經過會遇到三個重要的東西:庫library有梆,框架framework,包bundle意系。三者都是用來在多個應用中共享代碼用的泥耀,開發(fā)者無需知道內部實現(xiàn),只要使用暴露出來的接口即可蛔添。

1.庫

庫是最基本的共享代碼方式痰催,包括:靜態(tài)庫.a文件,動態(tài)庫.dylib文件迎瞧。

靜態(tài)庫:在應用程序編譯的過程中由鏈接程序鏈接到target當中夸溶,如果多個target共享一個靜態(tài)庫,靜態(tài)庫都會被包含在每個target中凶硅。

動態(tài)庫:應用程序運行時按照需求加載缝裁,動態(tài)庫代碼對于多個target來說是共享的,因此動態(tài)庫比靜態(tài)庫來說咏尝,運行速度更快压语。

注意:iOS只支持靜態(tài)庫,動態(tài)庫蘋果是不允許的编检,如果使用了動態(tài)庫,上架時很有可能被拒扰才。

2.框架

相當于一個文件夾允懂,包含了庫、界面構造器衩匣、圖片蕾总、本地化字符串、媒體琅捏、頭文件之類的資源生百。可以理解為柄延,框架包含了庫和包蚀浆。

框架沒有嚴格意義上的靜態(tài)和動態(tài)的分別缀程,開發(fā)者可以根據實際情況選擇是按需加載還是始終加載。

既然框架包含了庫市俊,為什么還要用庫呢杨凑?因為庫制作簡單,當我們只是想隱藏代碼摆昧,暴露接口撩满,庫是最好的方式∩鹉悖框架的話伺帘,制作步驟多,不便于維護忌锯。

3.包

包是一種特殊的文件夾伪嫁,在iOS里,包只能夠包含資源文件汉规,不能運行代碼礼殊。

4.使用框架和庫

4.1使用系統(tǒng)框架

選擇target->general選項卡(或者build phases選項卡)->Linked Frameworks and Libraries(build phases中l(wèi)ink binary with libraries)->"+"->選擇相應的框架

屏幕快照 2017-01-08 上午11.23.57.png

通過修改框架的狀態(tài),可以更改它們的編譯設置针史。如下圖晶伦,我可以看到框架的狀態(tài)status是Required舟陆,表示必須要有該框架桥胞,編譯的時候才能通過背稼。我們可以修改為Optional综芥,編譯的時候搂擦,如果需要這個框架才會編譯這個框架绍填。
屏幕快照 2017-01-08 上午11.26.21.png

修改框架的狀態(tài)歌逢,有時候是非常有用的签杈,比如說最新的iOS10推送推出了一個新的框架常空,我們必須用該框架適配iOS10沽一,我們導入了該框架,但是iOS10以前的手機是沒有該框架的漓糙,這會導致iOS10以前系統(tǒng)的手機出現(xiàn)閃退等莫名其妙的問題铣缠,我們就可以通過把該框架修改Optional,然后在代碼中判斷iOS系統(tǒng)如果是iOS10以后昆禽,然后再import該框架蝗蛙。

移除框架,只需要選中框架醉鳖,點擊"-"即可捡硅。

4.2使用第三方靜態(tài)庫

使用第三方的.a文件步驟:
將靜態(tài)庫拖到項目中合適位置,xcode會自動添加到linked frameworks and libraries當中盗棵,如果說你發(fā)現(xiàn)沒有自動添加壮韭,手動找到添加即可北发。

接下來,設置靜態(tài)庫連接路徑:
target->build setting->Search Paths->Library Search Paths中添加靜態(tài)庫目錄泰涂,指向靜態(tài)庫所在位置鲫竞。如果移動了靜態(tài)庫,要記得修改該路徑逼蒙。


屏幕快照 2017-01-08 上午11.50.28.png

別的需要的設置从绘,按照第三方庫的要求配置即可。

4.3使用第三方框架

第三方框架使用很簡單是牢,只需要將.framework文件導入項目中僵井,xcode會自動把框架放入對應位置。如果是靜態(tài)庫框架驳棱,會自動添加到linked frameworks and libraries中批什,動態(tài)庫框架,會自動添加到embedded binaries中社搅。如果發(fā)現(xiàn)沒有自動添加驻债,到對應位置,手動添加即可形葬。

5.創(chuàng)建框架和靜態(tài)庫

5.1創(chuàng)建靜態(tài)庫

創(chuàng)建步驟:
File->New->Target或者Project(Target創(chuàng)建一個在當前項目中復用的庫合呐,Project創(chuàng)建一個新的全局復用庫)->cocoa touch static library->輸入信息即可完成。


屏幕快照 2017-01-08 下午12.06.55.png
  • 如果我們添加的是target的靜態(tài)庫笙以,如圖所示:

    屏幕快照 2017-01-08 下午12.09.22.png

    項目中多出了一個Test分組和TARGETS下多出了一個Test對象淌实。
    我們將要復用的代碼放入.m文件中,接口暴露在.h文件中猖腕,可以創(chuàng)建多個.h.m文件拆祈,但是靜態(tài)庫文件只能是代碼文件。其中.h默認是靜態(tài)庫對外部的接口倘感,外部程序通過導入頭文件暴露的接口來使用靜態(tài)庫放坏。
    自動創(chuàng)建的是OC的文件,雖然swift也可以老玛,但是會比較麻煩轻姿。

  • 如果是Project靜態(tài)庫則如圖所示:


    屏幕快照 2017-01-08 下午12.09.12.png

接下來就是一段無聊的碼代碼時間。

我們把接口寫好逻炊,.m文件的實現(xiàn)寫好后,就可以開始配置靜態(tài)庫了犁享。
配置靜態(tài)庫:
點擊TARGETS中的靜態(tài)庫對象余素,查看選項卡,如圖:


屏幕快照 2017-01-08 下午12.30.45.png

選擇build phases->copy files炊昆,copy files欄目的主要作用是配置暴露給用戶的頭文件桨吊,我們在里面配置哪些頭文件是需要暴露的威根。

.a文件有真機和模擬器之分,真機的只能在真機上面運行视乐,模擬器只能在模擬器上面運行洛搀。

我們在Xcode工具欄上編譯方案里選擇靜態(tài)庫的編譯方案,如圖:


屏幕快照 2017-01-08 下午12.40.09.png

選擇編譯對象的時候佑淀,如果選了下方iOS simulators中的任意一項留美,則是編譯的模擬器庫,選擇device或者build only device伸刃,則編譯的是真機的庫谎砾。

選擇好后,使用Command+b或者product->build開始編譯捧颅。編譯完成后景图,我們在項目導航器的Products分組可以發(fā)現(xiàn)libTest.a由紅色變成了黑色。


屏幕快照 2017-01-08 下午12.46.08.png

選中碉哑,右鍵點擊挚币,選擇show in finder就能看的編譯好的.a文件了,我們就可以把這個.a文件和頭文件發(fā)給別人使用了扣典。添加該靜態(tài)庫方法上面已經講了妆毕,就不在贅述了,要注意的一點就是.h文件要跟著.a文件一起拖入項目才能使用激捏。

有時候我們會發(fā)現(xiàn)libTest依然是紅色的设塔,沒有變化,此時只需要關閉xocde远舅,重新打開闰蛔,就能看的是黑色的狀態(tài)了。

我可以使用lipo命令在終端上面图柏,將兩個.a文件合并成一個文件序六,這樣就沒有模擬器庫和真機庫之分了。
1.首先分別生成真機的庫文件蚤吹,查看文件然后拖動到桌面
2.生成模擬器的庫文件例诀,查看文件,然后拖動到桌面裁着,名稱可能會重復繁涂,修改一下名稱即可
3.使用終端cd到桌面
4.使用lipo命令合成兩個庫到一起:

lipo -create 模擬器庫 真機庫 -output 最終庫
lipo -create libTest.a libTestS.a -output test.a

5.使用lipo -info查看最終庫的信息

lipo -info test.a
Architectures in the fat file: test.a are: armv7 x86_64 arm64
可以看到支持arm和x86_64f,表明合成成功

5.2創(chuàng)建框架

同上二驰,創(chuàng)建的時候選擇Cocoa Touch Framework即可扔罪。

屏幕快照 2017-01-08 下午1.11.05.png

點擊新建的框架對象,在選項卡內桶雀,選擇build phases選項卡矿酵,其中Headers欄目中唬复,把需要公開的頭文件放入Public,私有的放入private全肮,項目內的放入project中敞咧。


屏幕快照 2017-01-08 下午1.12.22.png

在Build seeing->linking->mach-o type選項中,可以選擇生成的框架是包含的靜態(tài)庫還是動態(tài)庫辜腺,默認情況下是動態(tài)庫框架休建。

由于框架是Xcode6開始提供的新功能,所以哪自,如果說編譯的框架是要支持iOS7(包括iOS7)以前的丰包,那么必須選擇生成靜態(tài)庫框架,以后的壤巷,默認就行

屏幕快照 2017-01-08 下午1.16.38.png

配置好后邑彪,就可以編譯了,編譯的方式同上胧华,框架也有真機和模擬器之分寄症,處理方式同庫。編譯好后矩动,通過上方介紹的導入方式導入項目即可有巧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悲没,隨后出現(xiàn)的幾起案子篮迎,更是在濱河造成了極大的恐慌,老刑警劉巖示姿,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甜橱,死亡現(xiàn)場離奇詭異,居然都是意外死亡栈戳,警方通過查閱死者的電腦和手機岂傲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子檀,“玉大人镊掖,你說我怎么就攤上這事」犹担” “怎么了亩进?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缩歪。 經常有香客問我镐侯,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任苟翻,我火速辦了婚禮,結果婚禮上骗污,老公的妹妹穿的比我還像新娘崇猫。我一直安慰自己,他們只是感情好需忿,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布诅炉。 她就那樣靜靜地躺著,像睡著了一般屋厘。 火紅的嫁衣襯著肌膚如雪涕烧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天汗洒,我揣著相機與錄音议纯,去河邊找鬼。 笑死溢谤,一個胖子當著我的面吹牛瞻凤,可吹牛的內容都是我干的。 我是一名探鬼主播世杀,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阀参,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞻坝?” 一聲冷哼從身側響起蛛壳,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎所刀,沒想到半個月后衙荐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡勉痴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年赫模,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒸矛。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瀑罗,死狀恐怖,靈堂內的尸體忽然破棺而出雏掠,到底是詐尸還是另有隱情斩祭,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布乡话,位于F島的核電站摧玫,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜诬像,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一屋群、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坏挠,春花似錦芍躏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榜配,卻和暖如春否纬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛋褥。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工临燃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壁拉。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓谬俄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弃理。 傳聞我的和親對象是個殘疾皇子溃论,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • 靜態(tài)庫與動態(tài)庫的區(qū)別 首先來看什么是庫钥勋,庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,931評論 3 42
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理辆苔,服務發(fā)現(xiàn)算灸,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動態(tài)庫有什么異同驻啤?靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中菲驴,被多次使用就有多份冗...
    190CM閱讀 4,204評論 0 4
  • 希望 我們不是因為看到希望才去堅持,而是堅持下去才能看到希望骑冗。 距離 距離只有在得不到的時候才有價值赊瞬。 玩笑 你知...
    幻夢邪魂閱讀 154評論 0 0