Xcode上手之庫、框架、包

Xcode技巧系列:http://www.itdecent.cn/notebooks/7639304/latest

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

1.庫

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

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

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

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

2.框架

相當于一個文件夾,包含了庫、界面構(gòu)造器、圖片、本地化字符串、媒體、頭文件之類的資源。可以理解為,框架包含了庫和包。

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

既然框架包含了庫,為什么還要用庫呢?因為庫制作簡單,當我們只是想隱藏代碼,暴露接口,庫是最好的方式??蚣艿脑挘谱鞑襟E多,不便于維護。

3.包

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

4.使用框架和庫

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

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

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

通過修改框架的狀態(tài),可以更改它們的編譯設(shè)置。如下圖,我可以看到框架的狀態(tài)status是Required,表示必須要有該框架,編譯的時候才能通過。我們可以修改為Optional,編譯的時候,如果需要這個框架才會編譯這個框架。
屏幕快照 2017-01-08 上午11.26.21.png

修改框架的狀態(tài),有時候是非常有用的,比如說最新的iOS10推送推出了一個新的框架,我們必須用該框架適配iOS10,我們導(dǎo)入了該框架,但是iOS10以前的手機是沒有該框架的,這會導(dǎo)致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)沒有自動添加,手動找到添加即可。

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


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

別的需要的設(shè)置,按照第三方庫的要求配置即可。

4.3使用第三方框架

第三方框架使用很簡單,只需要將.framework文件導(dǎo)入項目中,xcode會自動把框架放入對應(yīng)位置。如果是靜態(tài)庫框架,會自動添加到linked frameworks and libraries中,動態(tài)庫框架,會自動添加到embedded binaries中。如果發(fā)現(xiàn)沒有自動添加,到對應(yīng)位置,手動添加即可。

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

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

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


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

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

    項目中多出了一個Test分組和TARGETS下多出了一個Test對象。
    我們將要復(fù)用的代碼放入.m文件中,接口暴露在.h文件中,可以創(chuàng)建多個.h.m文件,但是靜態(tài)庫文件只能是代碼文件。其中.h默認是靜態(tài)庫對外部的接口,外部程序通過導(dǎo)入頭文件暴露的接口來使用靜態(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開始編譯。編譯完成后,我們在項目導(dǎo)航器的Products分組可以發(fā)現(xiàn)libTest.a由紅色變成了黑色。


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

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

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

我可以使用lipo命令在終端上面,將兩個.a文件合并成一個文件,這樣就沒有模擬器庫和真機庫之分了。
1.首先分別生成真機的庫文件,查看文件然后拖動到桌面
2.生成模擬器的庫文件,查看文件,然后拖動到桌面,名稱可能會重復(fù),修改一下名稱即可
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

點擊新建的框架對象,在選項卡內(nèi),選擇build phases選項卡,其中Headers欄目中,把需要公開的頭文件放入Public,私有的放入private,項目內(nèi)的放入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

配置好后,就可以編譯了,編譯的方式同上,框架也有真機和模擬器之分,處理方式同庫。編譯好后,通過上方介紹的導(dǎo)入方式導(dǎo)入項目即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容