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)->"+"->選擇相應的框架
通過修改框架的狀態(tài),可以更改它們的編譯設置针史。如下圖晶伦,我可以看到框架的狀態(tài)status是Required舟陆,表示必須要有該框架桥胞,編譯的時候才能通過背稼。我們可以修改為Optional综芥,編譯的時候搂擦,如果需要這個框架才會編譯這個框架绍填。
修改框架的狀態(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)庫,要記得修改該路徑逼蒙。
別的需要的設置从绘,按照第三方庫的要求配置即可。
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->輸入信息即可完成。
-
如果我們添加的是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)庫對象余素,查看選項卡,如圖:
選擇build phases->copy files炊昆,copy files欄目的主要作用是配置暴露給用戶的頭文件桨吊,我們在里面配置哪些頭文件是需要暴露的威根。
.a文件有真機和模擬器之分,真機的只能在真機上面運行视乐,模擬器只能在模擬器上面運行洛搀。
我們在Xcode工具欄上編譯方案里選擇靜態(tài)庫的編譯方案,如圖:
選擇編譯對象的時候佑淀,如果選了下方iOS simulators中的任意一項留美,則是編譯的模擬器庫,選擇device或者build only device伸刃,則編譯的是真機的庫谎砾。
選擇好后,使用Command+b或者product->build開始編譯捧颅。編譯完成后景图,我們在項目導航器的Products分組可以發(fā)現(xiàn)libTest.a由紅色變成了黑色。
選中碉哑,右鍵點擊挚币,選擇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即可扔罪。
點擊新建的框架對象,在選項卡內桶雀,選擇build phases選項卡矿酵,其中Headers欄目中唬复,把需要公開的頭文件放入Public,私有的放入private全肮,項目內的放入project中敞咧。
在Build seeing->linking->mach-o type選項中,可以選擇生成的框架是包含的靜態(tài)庫還是動態(tài)庫辜腺,默認情況下是動態(tài)庫框架休建。
由于框架是Xcode6開始提供的新功能,所以哪自,如果說編譯的框架是要支持iOS7(包括iOS7)以前的丰包,那么必須選擇生成靜態(tài)庫框架,以后的壤巷,默認就行
配置好后邑彪,就可以編譯了,編譯的方式同上胧华,框架也有真機和模擬器之分寄症,處理方式同庫。編譯好后矩动,通過上方介紹的導入方式導入項目即可有巧。