開發(fā)過程中有時候需要講一些功能代碼封裝到靜態(tài)庫文件中,以確保代碼的安全性庆寺。
主要分為:靜態(tài)庫道逗、動態(tài)庫兩種
靜態(tài)庫和動態(tài)庫的存在形式
靜態(tài)庫: .a 和 .framework? ?
動態(tài)庫: .dylib 和 .framework
靜態(tài)庫:鏈接時拇舀,靜態(tài)庫會被完整地復(fù)制到可執(zhí)行文件中变抽, 被多次使用就有多份冗余拷貝
動態(tài)庫:鏈接時不復(fù)制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存掠抬,供程序調(diào)用吼野,系統(tǒng)只加載一次,多個程序共用两波,節(jié)省內(nèi)存瞳步。
需要注意的是:項目中如果使用了自制的動態(tài)庫,不能被上傳到 AppStore
所以基本上就用不到制作動態(tài)庫文件了腰奋,下面來說一說靜態(tài)庫文件单起,下面以本地framework為例。
靜態(tài)庫文件在編譯時劣坊,你選擇不同的設(shè)備時編譯出來的framework所支持的環(huán)境也會不同嘀倒,也就是你在制作完framework后,選擇的是在模擬器下編譯的話,那么你引入到其他工程中测蘑,就只能在模擬器下調(diào)用執(zhí)行灌危。如果你選擇的是在真機環(huán)境下編譯的話,那么你引入到其他工程中碳胳,只能在真機上調(diào)試運行勇蝙。
選擇不同的編譯環(huán)境,你編譯出的framework所支持的環(huán)境也不一樣固逗,每次在不同的環(huán)境下編譯后浅蚪,你可以選中你的framework(注意編譯command+B通過后,相應(yīng)的framework的名字顏色會又紅色變?yōu)楹谏┨陶郑髽?biāo)右鍵,Show in Finder洽故,可以對比一下贝攒,你會發(fā)現(xiàn)在模擬機版本編譯后的文件路徑在:Debug-iphonesimuator文件夾下。而選擇真機版本編譯后的文件路徑在:Debug-iphonesimuator文件夾下时甚。
so,問題來了隘弊,如果想要在真機跟模擬器下都能使用我們自己制作的framework的,要怎么解決這個問題呢荒适?總不能沒次更換不同環(huán)境下的framework吧(其實不怕麻煩的程序員可以這么整梨熙,但作為一個資深強迫癥患者程序員來說,太痛苦了刀诬,寶寶做不到啊)咽扇。
解決上面這個問題的話,就需要我們手動合并我們framework里面的一些文件陕壹。
舉例:
比如我編譯的framework為:ZHWActivity.framework
選擇不同環(huán)境下的framework质欲,并Show in Finder,會發(fā)現(xiàn)在兩個ZHWActivity.framework文件夾下面都有一個名為ZHWActivity(你編譯的framework的名字)的文件糠馆,這個文件在Mac下顯示的是一個白板文件嘶伟。
下面我們就需要將這個兩個文件合并成一個ZHWActivity文件:
在桌面新建一個文件夾merge,在merge文件夾下在新建兩個文件夾merge1又碌,merge2
講不同環(huán)境下的framework中的ZHWActivity(就是那個白板文件)九昧,分別放到這個兩個文件夾里。
然后打開終端毕匀,cd到merge目錄下铸鹰,執(zhí)行一下命令:
lipo -create merge1/ZHWActivity merge2/ZHWActivity -output ZHWActivity
(參考:lipo -create “……真機/目錄/那個白板文件“ "……/模擬器/目錄/那個白板文件" -output “…..另保存的/目錄/文件”)
在終端執(zhí)行完后,會發(fā)現(xiàn)在merge目錄下期揪,多出來一個ZHWActivity文件(也是一個白板文件)掉奄,這個就是已經(jīng)合并后的文件。
將合并后的文件拷貝一份,然后在你導(dǎo)入ZHWActivity.framework工程里姓建,Show in Finder一下诞仓。講工程里原來的ZHWActivity(舊的白板文件),替換成我們合并后的ZHWActivity(新的白板文件速兔,可以看一文件的大小已經(jīng)是之前舊文件的兩倍)墅拭。在重新編譯一下,你會神奇的發(fā)現(xiàn)涣狗,在真機跟模擬器下無縫切換谍婉,再也不會報錯了有木有。
tip1:同理在制作.a靜態(tài)庫文件時镀钓,也是區(qū)分真機跟模擬器的穗熬。也是可以按照上面的方法來合并**.a文件,方便我們開發(fā)過程中使用丁溅。
tip2:如果我們的制作的靜態(tài)庫文件中有包含的有.mm文件(c++跟oc混編的代碼文件)唤蔗,那么我么在其他地方導(dǎo)入時,就需要講相應(yīng)的.m文件也改為.mm文件才能正常使用窟赏。(如在ViewController.m中引入頭文件那么就需要改成ViewController.mm)妓柜。
關(guān)于靜態(tài)庫文件的制作可以參考下面這篇文章:
xocde7標(biāo)準(zhǔn)Framework靜態(tài)庫制作方法,工程轉(zhuǎn)Framework