轉(zhuǎn)載自:http://blog.csdn.net/crash163/article/details/52088096
歡迎去原作者地址閱讀,為防文章丟失沮趣,copy至此
?在開發(fā) iOS 應(yīng)用時屯烦,可能遇見這樣的情況:你想實現(xiàn)的某種功能(比如崩潰收集),已經(jīng)有成熟的產(chǎn)品提供房铭,可行的方案就是集成這個使用了很久驻龟,且有專業(yè)人員維護,最重要的是“免費”的產(chǎn)品缸匪。一番折騰之后翁狐,運行時有可能出現(xiàn)"selector not recognized"錯誤,最后發(fā)現(xiàn)是少了如下的配置(Build Settings -> "-ObjC"):
?那么這個"–ObjC" 到底是個什么鬼豪嗽? 我們來扒一扒谴蔑。
? ? ? ?"-ObjC" 的使用場景
? ? ? ? 據(jù)坊間說:如果你集成了有 category 的靜態(tài)庫豌骏,有可能出現(xiàn)上述錯誤。原因就是:Technical Q&A QA1490??
? ? ? ??"An impedance mismatch between UNIX static libraries and the dynamic nature of Objective-C can cause category methods in static libraries to not be linked into an app, resulting in "selector not recognized" exceptions when the methods aren't found at runtime."
這段話的意思就是:鏈接器在處理包含Category方法的UNIX的靜態(tài)庫時隐锭,沒有將Category的方法鏈接到APP中窃躲,造成這個錯誤。具體的細節(jié)在本文的補充部分展開钦睡。
可以看出蒂窒,解決這個錯誤的方法就是:將Category的方法鏈接到APP中,這樣APP運行時荞怒,就能夠找到對應(yīng)的selector洒琢。而 –ObjC就可以完成這個任務(wù)。
"-ObjC"的作用是:將靜態(tài)庫中任何Objective-C代碼都鏈接到APP中褐桌。任何Objective-C代碼當然也包括Category的方法衰抑。可以看出荧嵌,使用-ObjC可能會鏈接很多靜態(tài)庫中未被使用的Objective-C代碼呛踊,極大的增加APP的代碼體積。
? ? ? "-ObjC" 的兄弟
和 "-ObjC"作用類似的有以上的五種方案啦撮√吠可以看出,從增加APP代碼體積來看赃春,偽符號方案增加得最少"Perform Single-Object Prelink"愉择、 "-force_load" 和 "–ObjC" 次之,"-all_load" 增加得最多织中。
在開發(fā)iOS SDK時,為了方便使用者手動集成站楚,最好是減少使用者需要配置的信息搏嗡,所以"偽符號"方案和 "Perform Single-Object Prelink"方案是推薦的采盒。另外,第三方SDK常常是閉源的尺栖,對于使用者來說,偽符號是透明的延赌,所以從簡便性角度看,推薦"Perform Single-Object Prelink"方案者蠕。
? ? ? ? "selector not recognized"錯誤的產(chǎn)生根源
iOS工程掐松,從源文件到生成最終的APP文件,通常要經(jīng)過如下步驟:
?源文件經(jīng)過編譯和優(yōu)化后抡句,會生成目標代碼。目標代碼中包括符號表,標示了此代碼中的全局符號和靜態(tài)符號究抓,還標示了導(dǎo)入符號等,鏈接器會根據(jù)符號表分析各個目標代碼之間的調(diào)用關(guān)系绑嘹,然后將使用到的代碼進行鏈接和重定位工腋,最后生成可執(zhí)行文件。
在編譯Objective-C源文件到目標文件時蟋恬,編譯器并不知道方法的對應(yīng)實現(xiàn)趁冈,只能在運行時才知道渗勘,所以編譯器只會為類生成鏈接符號,對類中的方法不會生成鏈接符號乔遮。由于Category方法并不對應(yīng)一個新類取刃,所以不會生成鏈接符號出刷,鏈接器也不會將Category方法合并到原始的類中馁龟,最終導(dǎo)致鏈接器忽略了Category方法屁柏,不會將其鏈接到可執(zhí)行文件中有送。
??????更多資訊請關(guān)注網(wǎng)易云捕微信公眾號,網(wǎng)易云捕官方微博~~
參考
2涯塔、Objective-C categories in static library
轉(zhuǎn)載自:http://blog.csdn.net/crash163/article/details/52088096
歡迎去原作者地址閱讀清蚀,為防文章丟失枷邪,copy至此