一饮醇、什么是庫毕源?
庫是共享程序代碼的方式浪漠。
庫從本質上來說是一種可執(zhí)行代碼的二進制格式,可以被載入內存中執(zhí)行霎褐。庫分靜態(tài)庫和動態(tài)庫兩種址愿。
iOS中的靜態(tài)庫有 .a 和 .framework兩種形式;動態(tài)庫有.dylib 和 .framework 形式冻璃,后來.dylib動態(tài)庫又被蘋果替換成.tbd的形式响谓。
二、靜態(tài)庫與動態(tài)庫的區(qū)別省艳?
靜態(tài)庫: 鏈接時完整地拷貝至可執(zhí)行文件中娘纷,被多次使用就有多份冗余拷貝。
動態(tài)庫: 鏈接時不復制跋炕,程序運行時由系統(tǒng)動態(tài)加載到內存赖晶,供程序調用,系統(tǒng)只加載一次辐烂,多個程序共用遏插,節(jié)省內存。[ios暫時只允許使用系統(tǒng)動態(tài)庫]纠修;
靜態(tài)庫和動態(tài)庫是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標代碼中胳嘲,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標代碼中扣草,只是在程序運行時才被載入了牛,因為在程序運行期間還需要動態(tài)庫的存在颜屠。
總結:同一個靜態(tài)庫在不同程序中使用時,每一個程序中都得導入一次鹰祸,打包時也被打包進去甫窟,形成一個程序。而動態(tài)庫在不同程序中福荸,打包時并沒有被打包進去蕴坪,只在程序運行使用時,才鏈接載入(如系統(tǒng)的框架如UIKit敬锐、Foundation等),所以程序體積會小很多呆瞻,但是蘋果不讓使用自己的動態(tài)庫台夺,否則審核就無法通過。
三痴脾、iOS里靜態(tài)庫形式颤介?
.a和.framework
四、iOS里動態(tài)庫形式赞赖?
.dylib和.framework
五滚朵、framework為什么既是靜態(tài)庫又是動態(tài)庫?
系統(tǒng)的.framework是動態(tài)庫前域,我們自己建立的.framework是靜態(tài)庫辕近。
六、a與.framework有什么區(qū)別匿垄?
.a是一個純二進制文件移宅,.framework中除了有二進制文件之外還有資源文件。
.a文件不能直接使用椿疗,至少要有.h文件配合漏峰,.framework文件可以直接使用。
.a + .h + sourceFile = .framework届榄。
建議用.framework.
七浅乔、為什么要使用靜態(tài)庫?
方便共享代碼铝条,便于合理使用靖苇。
實現(xiàn)iOS程序的模塊化」ド梗可以把固定的業(yè)務模塊化成靜態(tài)庫顾复。
和別人分享你的代碼庫,但不想讓別人看到你代碼的實現(xiàn)鲁捏。
開發(fā)第三方sdk的需要芯砸。
八萧芙、制作靜態(tài)庫時的幾點注意:
注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫,我們需要的都是二進制文件+.h+其它資源文件的形式假丧,不同的是双揪,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用包帚,而.framework本身已經包含了.h和其它文件渔期,可以直接使用。
圖片資源的處理:兩種靜態(tài)庫渴邦,一般都是把圖片文件單獨的放在一個.bundle文件中疯趟,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄谋梭,新建一個文件夾信峻,把它改名為.bundle就可以了,右鍵瓮床,顯示包內容可以向其中添加圖片資源盹舞。
category是我們實際開發(fā)項目中經常用到的,把category打成靜態(tài)庫是沒有問題的隘庄,但是在用這個靜態(tài)庫的工程中踢步,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態(tài)庫的工程中配置other linker flags的值為-ObjC丑掺。
如果一個靜態(tài)庫很復雜获印,需要暴露的.h比較多的話,就可以在靜態(tài)庫的內部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同)吼鱼,然后把所有需要暴露出來的.h文件都集中放在這個.h文件中蓬豁,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了菇肃。