記錄使用performSelector產生的bug和調試過程

說說NSObject的 performSelector 系列函數(shù)

記錄調試這個bug的過程

說說遇到的bug

?????說之前先說說遇到的bug,公司項目,Target最低終于支持iOS8以上道逗,web頁以前使用的是UIWebView,iOS8之后,蘋果推出了WKWebView,新寫的功能需要使用到WKWebView烫扼,在之前使用UIWebView的時候,H5為了兼容安卓和iOS,會做平臺類型判斷碍庵,這次團隊決定使用iOS,安卓和H5通用的一套javaScript和原生的APP交互SDK,最終挑選了DSBridge,文檔上說是一款三端易用的現(xiàn)代跨平臺 Javascript bridge映企, 通過它,你可以在Javascript和原生之間同步或異步的調用彼此的函數(shù)静浴,

????? 聯(lián)調過后卑吭,一切完美,同步马绝,異步方式都可以調用,但是最終打包給測試同學的時候挣菲,崩潰了富稻,經過一番檢查掷邦,發(fā)現(xiàn)在同步調用情況下崩潰,并且在DEBUG模式下沒有崩潰椭赋,在RElease模式下崩潰抚岗,javascript回調客戶端注冊的方法的時候直接 EXC_BAD_ACCESS 經過一番檢查,在同步或者異步方式回調的時候使用了 performSelector這個方法哪怔,先看看DSBridge部分源代碼:

-(NSString *)call:(NSString*) method :(NSString*) argStr {
  ...只貼重要部分
  // 異步調用
  SuppressPerformSelectorLeakWarning(
                                            [JavascriptInterfaceObject performSelector:selasyn withObject:arg withObject:completionHandler];
                                            );
    // 同步調用
    id ret;
   SuppressPerformSelectorLeakWarning(
                                      ret=[JavascriptInterfaceObject performSelector:sel withObject:arg];
                                   );
}

?????DSBridge這樣設計宣蔚,會因為異步調用的時候客戶端通過completionHandler直接回調web端,而同步的時候得到一個返回值认境,在執(zhí)行js,通過js回調給web端,其中JavascriptInterfaceObject是客戶端注冊的調用對象胚委,可以看到使用了performSelector,同事確定release模式下崩潰叉信,我看到EXC_BAD_ACCESS 首先想到的是某個對象被釋放掉了亩冬,但是又給這個對象發(fā)了消息,但是日志都能正確硼身,一點一點定位位置硅急,直到無意中將同步調用方法的接收參數(shù)ret 去掉,才發(fā)現(xiàn)沒有崩潰了佳遂,確定本次崩潰和performSelector有關营袜。

?????仔細想想performSelector函數(shù)到底返回什么,說不清楚丑罪,NSObject.h中沒有注釋荚板,文檔中寫的返回值是void,函數(shù)定義的返回的是一個id類型。于是寫一個Demo測試巍糯,在debug模式下啸驯,給有個對象通過performSelector發(fā)送2個消息,這2個方法分別是方法A和方法B,方法A有返回值祟峦,方法B返回值為void罚斗,得到結果方法A的返回值是調用函數(shù)的返回值,調用方法B 直接崩潰宅楞。終于確定問題针姿。

?????為什么會崩潰呢,和調用方法是否有返回值有關厌衙,以前也知道performSelector編譯器不會對對象距淫,方法,進行檢驗婶希,會有內存泄露的可能產生榕暇,performSelector會把編譯時做的事情放到了運行時期,點擊這里去看一些performSelector的詳細介紹,因為不知道即將調用的selector是否有返回值彤枢,只有到了運行期才去檢測狰晚,調用了返回值為Void的一些函數(shù),相當于直接是 id obj = void,當然是OC語法不允許的缴啡,直接崩潰是必然的壁晒。

?????為什么我們自己的項目在Debug模式下正常呢,于是在項目中寫了局代碼測試,發(fā)現(xiàn)會返回一個nil业栅,猜測可能在哪個地方在進行了方法交換秒咐,查了代碼,沒有查到碘裕,可能是在某個SDK中携取,如圖:


WX20180413-011434@2x.png

總結

本次調試bug慢比較慢的原因:

  1. 對performSelector只知道怎么去用,細節(jié)部分沒想過娘汞,比如函數(shù)的返回值歹茶,將編譯時期可以報出的錯誤放到了運行時期,等等
  2. DSBridge源碼看過你弦,但是看的不仔細惊豺,花了好一會才了解整體調用過程。
  3. 查bug的時候會去猜測禽作,可能是哪個原因尸昧,然后通過注釋代碼來找問題(知識掌握的不牢固)
  4. 在使用第三方庫的時候一定要讀懂核心部分源碼,在遇到問題的時候才能夠快速定位問題旷偿。

歸根結底都是對知識掌握的不牢固烹俗,踩的坑還不夠多。
所有的bug都有他們必現(xiàn)的原因萍程,只是我沒有找到原因而已幢妄。

我以為的不一定是我以為的

????? 原本以為已經解決了這個問題,但是自己寫Demo的時候是在模擬器上測試茫负,公司項目是在真機上測試蕉鸳,都在真機上運行都沒有崩潰,寫的demo也返回了第一個固定參數(shù)忍法,公司項目傳入?yún)?shù){"action":"customservice"} 就直接崩潰 在真機上和在模擬器上有什么不同嗎潮尝?模擬器和真機都是iOS 11.3系統(tǒng),自己公司的項目為什么會發(fā)生崩潰呢饿序?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勉失,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子原探,更是在濱河造成了極大的恐慌乱凿,老刑警劉巖顽素,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告匠,居然都是意外死亡戈抄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門后专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人输莺,你說我怎么就攤上這事戚哎。” “怎么了嫂用?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵型凳,是天一觀的道長。 經常有香客問我嘱函,道長甘畅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任往弓,我火速辦了婚禮疏唾,結果婚禮上,老公的妹妹穿的比我還像新娘函似。我一直安慰自己槐脏,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布撇寞。 她就那樣靜靜地躺著顿天,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔑担。 梳的紋絲不亂的頭發(fā)上牌废,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音啤握,去河邊找鬼鸟缕。 笑死,一個胖子當著我的面吹牛恨统,可吹牛的內容都是我干的叁扫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畜埋,長吁一口氣:“原來是場噩夢啊……” “哼莫绣!你這毒婦竟也來了?” 一聲冷哼從身側響起悠鞍,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤对室,失蹤者是張志新(化名)和其女友劉穎模燥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掩宜,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蔫骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牺汤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽旋。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖檐迟,靈堂內的尸體忽然破棺而出补胚,到底是詐尸還是另有隱情,我是刑警寧澤追迟,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布溶其,位于F島的核電站,受9級特大地震影響敦间,放射性物質發(fā)生泄漏瓶逃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一廓块、第九天 我趴在偏房一處隱蔽的房頂上張望厢绝。 院中可真熱鬧,春花似錦剿骨、人聲如沸代芜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤庇。三九已至,卻和暖如春贷掖,著一層夾襖步出監(jiān)牢的瞬間嫡秕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工苹威, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昆咽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓牙甫,卻偏偏與公主長得像掷酗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窟哺,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理泻轰,服務發(fā)現(xiàn),斷路器且轨,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 在俄羅斯的列夫·托爾斯泰紀念館里陳列著一張普希金娜新婚后不久的肖像畫浮声,這張肖像畫托爾斯泰從未見到過虚婿,但小說中出現(xiàn)在...
    pengbaoer閱讀 3,598評論 0 4
  • Too many tips that how we make a difference in life are t...
    吳必森Brady閱讀 165評論 2 0
  • 前言 在自動化測試實踐過程中,必不可少的就是進行日志管理泳挥,方便調試和生產問題追蹤然痊,python提供了logg...
    苦葉子閱讀 814評論 0 0