-ObjC這個flag告訴鏈接器把庫中定義的Objective-C類和Category都加載進(jìn)來。這樣編譯之后的app會變大(因為加載了其他的objc代碼進(jìn)來)。但是如果靜態(tài)庫中有類和category的話只有加入這個flag才行。
-all_load這個flag是專門處理-ObjC的一個bug的。用了-ObjC以后,如果類庫中只有category沒有類的時候這些category還是加載不進(jìn)來。變通方法就是加入-all_load或者-force-load。-all_load會強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來,即使沒有objc代碼。-force_load在xcode3.2后可用。但是-force_load后面必須跟一個只想靜態(tài)庫的路徑。
注意1:靜態(tài)庫并不會將資源打包進(jìn)入,如果靜態(tài)庫中用到了其他資源,必須手動的導(dǎo)入
開發(fā)技巧 不建議直接導(dǎo)入資源
可以在終端上借助lipo -info 靜態(tài)庫文件地址這個指令查看當(dāng)前靜態(tài)庫支持的平臺
可以使用這個指令將模擬器的靜態(tài)庫與真機(jī)的靜態(tài)庫進(jìn)行合并 :lipo -creat 需要合并的靜態(tài)庫1 需要合并的靜態(tài)庫2 -output 合并之后的文件名稱該方式同樣可以把模擬器的framework與真機(jī)的framework合并
注意2:雖然將真機(jī)和模擬器的靜態(tài)庫合并在一起之后,以后我們就不用關(guān)心當(dāng)前是允許真機(jī)還是模擬器了,但是程序在發(fā)布的時候建議使用真機(jī)的靜態(tài)庫,因為文件小,便于編譯
注意3:如果要在當(dāng)前工程中開發(fā)靜態(tài)庫,需要配置targets > build Phases > target Dependenies > Link Binary WithLibraries
靜態(tài)庫文件的版本(4種)
1.真機(jī)-Debug版本 調(diào)試的版本
2.真機(jī)-Release版本 發(fā)布的版本
3.模擬器-Debug版本
4.模擬器-Release版本
調(diào)試版本VS發(fā)布版本
-調(diào)試版本會包含完整的符號信息,以方便調(diào)試
-調(diào)試版本不會對代碼進(jìn)行優(yōu)化
-發(fā)布版本不會包含完整的符號信息
-發(fā)布版本的執(zhí)行代碼是進(jìn)行過優(yōu)化的
-發(fā)布版本的大小會比調(diào)試版本的略小
-在執(zhí)行速度方面,發(fā)布版本會更快些,但不意味著會有顯著的提升
如果使用framework是直接根據(jù)對應(yīng)的模板生成的,默認(rèn)情況下是生成的動態(tài)庫而不是靜態(tài)庫 會報這樣的錯誤: Reason: image not found,這是Xcode6之后才有的也就是說明了直接根據(jù)對應(yīng)的模板生成的framework,在Xcode6以下的編譯器無法使用
下圖為動靜態(tài)庫的添加位置