http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html
-Objc
之所以使用該標(biāo)志,和Objective-C的一個(gè)重要特性:類別(category)有關(guān)。根據(jù)這里的解釋粗俱,Unix的標(biāo)準(zhǔn)靜態(tài)庫實(shí)現(xiàn)和Objective-C的動(dòng)態(tài)特性之間有一些沖突:Objective-C沒有為每個(gè)函數(shù)(或者方法)定義鏈接符號,它只為每個(gè)類創(chuàng)建鏈接符號外邓。這樣當(dāng)在一個(gè)靜態(tài)庫中使用類別來擴(kuò)展已有類的時(shí)候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來,在編譯到靜態(tài)庫時(shí),這些代碼模塊實(shí)際上是存在不同的obj文件里的墨林。程序在連接Category方法時(shí),實(shí)際上只加載了Category模塊犯祠,擴(kuò)展的基類代碼并沒有被加載旭等。這樣,程序雖然可以編譯通過衡载,但是在運(yùn)行時(shí)搔耕,因?yàn)檎也坏交惸K,就會出現(xiàn) unrecognized selector 這樣的錯(cuò)誤痰娱。就會導(dǎo)致你調(diào)用類別中的方法時(shí)弃榨,出現(xiàn)"selector not recognized",也就是找不到方法定義的錯(cuò)誤梨睁。為了解決這個(gè)問題鲸睛,引入了-ObjC標(biāo)志,它的作用就是將靜態(tài)庫中所有的和對象相關(guān)的文件都加載進(jìn)來坡贺。這樣編譯之后的app會變大(因?yàn)榧虞d了其他的objc代碼進(jìn)來)官辈。
-all_load
這個(gè)flag是專門處理-ObjC的一個(gè)bug的箱舞。在64位的Mac系統(tǒng)或者iOS系統(tǒng)下,鏈接器有一個(gè)bug拳亿,會導(dǎo)致只包含有類別的靜態(tài)庫無法使用-ObjC標(biāo)志來加載文件晴股。用了-ObjC以后,如果類庫中只有category沒有類的時(shí)候這些category還是加載不進(jìn)來肺魁。變通方法就是加入-all_load或者-force-load电湘。-all_load會強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來,即使沒有objc代碼鹅经。-force_load在xcode3.2后可用寂呛。但是-force_load后面必須跟一個(gè)指向靜態(tài)庫的路徑,指定具體的文件瞬雹。