聊聊 "-ObjC" 的故事

"民之失德耕肩,乾糇以愆;他山之石问潭,可以攻玉猿诸。"? - 《詩(shī)經(jīng)》

在開(kāi)發(fā) iOS 應(yīng)用時(shí),可能遇見(jiàn)這樣的情況:你想實(shí)現(xiàn)的某種功能(比如崩潰收集)狡忙,已經(jīng)有成熟的產(chǎn)品提供梳虽,可行的方案就是集成這個(gè)使用了很久,且有專(zhuān)業(yè)人員維護(hù)去枷,最重要的是“免費(fèi)”的產(chǎn)品怖辆。一番折騰之后,運(yùn)行時(shí)有可能出現(xiàn)"selector not recognized"錯(cuò)誤删顶,最后發(fā)現(xiàn)是少了如下的配置(Build Settings -> "-ObjC"):

那么這個(gè)"–ObjC" 到底是個(gè)什么鬼竖螃? 我們來(lái)扒一扒。

"-ObjC" 的使用場(chǎng)景

據(jù)坊間說(shuō):如果你集成了有 category 的靜態(tài)庫(kù)逗余,有可能出現(xiàn)上述錯(cuò)誤特咆。原因就是: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)庫(kù)時(shí),沒(méi)有將Category的方法鏈接到APP中录粱,造成這個(gè)錯(cuò)誤腻格。具體的細(xì)節(jié)在本文的補(bǔ)充部分展開(kāi)。

可以看出啥繁,解決這個(gè)錯(cuò)誤的方法就是:將Category的方法鏈接到APP中菜职,這樣APP運(yùn)行時(shí),就能夠找到對(duì)應(yīng)的selector旗闽。而 –ObjC就可以完成這個(gè)任務(wù)酬核。

"-ObjC"的作用是:將靜態(tài)庫(kù)中任何Objective-C代碼都鏈接到APP中蜜另。任何Objective-C代碼當(dāng)然也包括Category的方法〉找猓可以看出举瑰,使用-ObjC可能會(huì)鏈接很多靜態(tài)庫(kù)中未被使用的Objective-C代碼,極大的增加APP的代碼體積蔬螟。

"-ObjC" 的兄弟

和 "-ObjC"作用類(lèi)似的有以上的五種方案此迅。可以看出旧巾,從增加APP代碼體積來(lái)看耸序,偽符號(hào)方案增加得最少"Perform Single-Object Prelink"、 "-force_load" 和 "–ObjC" 次之菠齿,"-all_load" 增加得最多佑吝。

在開(kāi)發(fā)iOS SDK時(shí),為了方便使用者手動(dòng)集成绳匀,最好是減少使用者需要配置的信息,所以"偽符號(hào)"方案和 "Perform Single-Object Prelink"方案是推薦的炸客。另外疾棵,第三方SDK常常是閉源的,對(duì)于使用者來(lái)說(shuō)痹仙,偽符號(hào)是透明的是尔,所以從簡(jiǎn)便性角度看,推薦"Perform Single-Object Prelink"方案开仰。

"selector not recognized"錯(cuò)誤的產(chǎn)生根源

iOS工程拟枚,從源文件到生成最終的APP文件鹉动,通常要經(jīng)過(guò)如下步驟:

源文件經(jīng)過(guò)編譯和優(yōu)化后桃纯,會(huì)生成目標(biāo)代碼。目標(biāo)代碼中包括符號(hào)表寺酪,標(biāo)示了此代碼中的全局符號(hào)和靜態(tài)符號(hào)谓娃,還標(biāo)示了導(dǎo)入符號(hào)等脚乡,鏈接器會(huì)根據(jù)符號(hào)表分析各個(gè)目標(biāo)代碼之間的調(diào)用關(guān)系,然后將使用到的代碼進(jìn)行鏈接和重定位滨达,最后生成可執(zhí)行文件奶稠。

在編譯Objective-C源文件到目標(biāo)文件時(shí),編譯器并不知道方法的對(duì)應(yīng)實(shí)現(xiàn)捡遍,只能在運(yùn)行時(shí)才知道锌订,所以編譯器只會(huì)為類(lèi)生成鏈接符號(hào),對(duì)類(lèi)中的方法不會(huì)生成鏈接符號(hào)画株。由于Category方法并不對(duì)應(yīng)一個(gè)新類(lèi)辆飘,所以不會(huì)生成鏈接符號(hào)涩搓,鏈接器也不會(huì)將Category方法合并到原始的類(lèi)中,最終導(dǎo)致鏈接器忽略了Category方法劈猪,不會(huì)將其鏈接到可執(zhí)行文件中昧甘。

網(wǎng)易云捕-網(wǎng)易旗下最專(zhuān)業(yè)的APP質(zhì)量跟蹤平臺(tái)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市战得,隨后出現(xiàn)的幾起案子充边,更是在濱河造成了極大的恐慌,老刑警劉巖常侦,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浇冰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聋亡,警方通過(guò)查閱死者的電腦和手機(jī)肘习,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坡倔,“玉大人漂佩,你說(shuō)我怎么就攤上這事∽锼” “怎么了投蝉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)征堪。 經(jīng)常有香客問(wèn)我瘩缆,道長(zhǎng),這世上最難降的妖魔是什么佃蚜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任庸娱,我火速辦了婚禮,結(jié)果婚禮上谐算,老公的妹妹穿的比我還像新娘熟尉。我一直安慰自己,他們只是感情好氯夷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布臣樱。 她就那樣靜靜地躺著,像睡著了一般腮考。 火紅的嫁衣襯著肌膚如雪雇毫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天踩蔚,我揣著相機(jī)與錄音棚放,去河邊找鬼。 笑死馅闽,一個(gè)胖子當(dāng)著我的面吹牛飘蚯,可吹牛的內(nèi)容都是我干的馍迄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼局骤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攀圈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起峦甩,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赘来,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凯傲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犬辰,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冰单,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幌缝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诫欠,死狀恐怖涵卵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呕诉,我是刑警寧澤缘厢,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站甩挫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椿每。R本人自食惡果不足惜伊者,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望间护。 院中可真熱鬧亦渗,春花似錦、人聲如沸汁尺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痴突。三九已至搂蜓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辽装,已是汗流浹背帮碰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾积,地道東北人殉挽。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓丰涉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斯碌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子一死,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件傻唾、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,290評(píng)論 7 249
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,682評(píng)論 0 9
  • 當(dāng)愛(ài)被感染 是塵世里 你安放的一枚毒藥 擴(kuò)散猴抹,再擴(kuò)散 帶走了一批又一批零界生命 從此 我便不再死去 天空有我的影子...
    董言閱讀 151評(píng)論 2 10
  • Cigars dropped Left only the smoke Rolling Rolling around...
    Laraaaaa閱讀 192評(píng)論 0 1