知識普及:
什么是庫?
庫是程序代碼的集合扯旷,是共享程序代碼的一種方式
根據源代碼的公開情況拯爽,庫可以分為 2 種類型
開源庫
公開源代碼,能看到具體實現
比如 SDWebImage 钧忽、 AFNetworking
閉源庫
不公開源代碼毯炮,是經過編譯后的二進制文件,看不到具體實現
主要分為:靜態(tài)庫耸黑、動態(tài)庫
靜態(tài)庫和動態(tài)庫
靜態(tài)庫和動態(tài)庫的存在形式
靜態(tài)庫: .a 和 .framework
動態(tài)庫: .dylib 和 .framework
靜態(tài)庫和動態(tài)庫在使用上的區(qū)別
靜態(tài)庫:鏈接時桃煎,靜態(tài)庫會被完整地復制到可執(zhí)行文件中, 被多次使用就有多份冗余拷貝 (左圖所示)
動態(tài)庫:鏈接時不復制大刊,程序運行時由系統(tǒng)動態(tài)加載到內存为迈,供程序調用,系統(tǒng)只加載一次缺菌,多個程序共用葫辐,節(jié)省內存 (右圖所示)
需要注意的是:以前項目中如果使用了自制的動態(tài)庫,不能被上傳到 AppStore伴郁!但是現在是可以了耿战,給海爾的一個項目打得動態(tài)庫,也沒問題焊傅。
制作 .a
1剂陡、新建項目-> 選擇 “Cocoa Touch Static Library”
2狈涮、添加庫需要包含的源代碼,將你工程里的代碼添加到打靜態(tài)庫工程里:
3鸭栖、配置一下工程:
4歌馍、選擇需要暴露出來的 .h 文件, .m 文件會自動編譯到 .a 文件中:
需要暴漏出的文件類在這里設置:
引入的網絡框架設置:(有些會自動引入晕鹊,有些需要手動引入松却,根據編譯報錯,可以檢查捏题。)
5玻褪、編譯前檢查一下是debug模式還是release模式,選擇release模式:
分debug和release模式:
Debug-iphoneos 文件夾里面的東西是用在真機上的
Debug-iphonesimulator 文件夾里面的東西是用在模擬器上的
如果 Scheme 是 Release 模式公荧,生成的文件夾就以 Release 開頭
6带射、選擇真機設備,然后 Command+B 編譯循狰, libSPCustomerServerse.a 文件從紅色變?yōu)楹谏?/p>
(注意建議先選擇真機窟社,這樣才會變色,如果先選擇模擬器绪钥,那么編譯通過了灿里,但是不會由紅變黑,實際上是已經編譯了模擬器的程腹,只是給人一種假象匣吊,好像沒編譯一樣,還是紅色的)
7寸潦、選擇模擬器色鸳,建議選擇iPhone6以上的(選擇高級點的,低級的也可用见转,若選了低級的命雀,高級的有可能就不適配了)然后依然 Command+B 編譯,模擬器和真機環(huán)境下用的 .a 文件是分開的斩箫。
8吏砂、合并模擬器(release-iphonesimulator)和真機(release-iphoneos)下的.a,以便支持真機和模擬器乘客,合并后的.a大小大約是不合并的2倍左右狐血。
show in finder
合并步驟:
舉例:1、新建文件夾:"dabao"易核;
2匈织、將上述的release-iphonesimulator和release-iphoneos兩個文件拷貝進"dabao"文件夾。
3耸成、打開終端报亩,執(zhí)行以下操作:
一、在終端輸入:lipo? -create
二井氢、將release-iphonesimulator下的.a拖進終端弦追,輸入一個空格;
三花竞、繼續(xù)將release-iphoneos 下.a 拖進終端劲件,輸入空格;
四约急、繼續(xù)輸入:-output 零远,打個空格;
五厌蔽、輸入合并后的.a所要放的文件路徑(這里舉例依然放在“dabao”這個文件夾下,則我的電腦的路徑為:/Users/ntalker-zhou/Desktop/dabao/libSPCustomerServerseSDK.a)牵辣,回車,在相應的文件下即可生成一個.a,該.a即是合并后的.a
4奴饮、檢查合并后的.a是不是滿足所有要求纬向,依然在終端進行以下操作:
一、在終端輸入:lipo? -info? ;
二戴卜、將合并后的.a拖進終端 逾条,回車;
(注意:終端每一步記得要用空格隔開投剥,否則會出錯哦Jχ)
這樣.a 就成功制作出了,只需要將暴漏的頭文件以及制作的.a放入工程江锨,別人就可以使用你的程序了吃警,再也不用擔心源碼暴漏或別人隨意修改你的代碼了,不過如果有圖片資源泳桦,圖片資源是不能打進.a的汤徽,需要在外面添加的哦。
(有時候為了編譯通過灸撰,根據需要谒府,需要設置一下工程配置比如我需要配置xml等…
另外Xcode 12打包framework 報錯:have the same architectures (arm64) and can't be in the same fat output file
解決辦法參考:http://www.reibang.com/p/781795e98444