在自己的Xcode工程中導(dǎo)入第三方庫靜態(tài)庫時,我們常常在Xcode的Build Settings下Other Linker Flags里面加入-ObjC標志,它和Objective-C的一個重要特性:類別(category)有關(guān)。
Unix的標準靜態(tài)庫實現(xiàn)和Objective-C的動態(tài)特性之間有一些沖突:Objective-C沒有為每個函數(shù)(或者方法)定義鏈接符號,它只為每個類創(chuàng)建鏈接符號。這樣當(dāng)在一個靜態(tài)庫中使用類別來擴展已有類的時候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來,就會導(dǎo)致你調(diào)用類別中的方法時,出現(xiàn)"selector not recognized",也就是找不到方法定義的錯誤。為了解決這個問題,引入了-ObjC標志,它的作用就是將靜態(tài)庫中所有的和對象相關(guān)的文件都加載進來。
-ObjC:這個flag告訴鏈接器把庫中定義的Objective-C類和Category都加載進來。這樣編譯之后的app會變大(因為加載了其他的objc代碼進來)。但是如果靜態(tài)庫中有類和category的話只有加入這個flag才行。
-all_load:這個flag是專門處理-ObjC的一個bug的。用了-ObjC以后,如果類庫中只有category沒有類的時候這些category還是加載不進來。變通方法就是加入-all_load或者-force-load。-all_load會強制鏈接器把目標文件都加載進來,即使沒有objc代碼。-force_load在xcode3.2后可用。但是-force_load后面必須跟一個只想靜態(tài)庫的路徑。