? ? ? ?故事要從一個崩潰的Bug說起垃你。某日,W君寫好了一個方法提交給同事調(diào)用喂很,不久同事反饋惜颇,有概率性的出現(xiàn)崩潰。納尼少辣,崩潰凌摄!二話不說,開始了問題排查五萬里的路程毒坛。
? ? ?重現(xiàn):
? ? ? ?很快找到了重現(xiàn)步驟望伦,經(jīng)過觀察,不是每次操作都會出現(xiàn)崩潰煎殷,尤其是第一次操作都不會出現(xiàn)崩潰屯伞。而崩潰時Xcode只顯示了如下的內(nèi)存地址錯誤,沒有更具體的原因豪直。
? ? ? ?看起來劣摇,像是對某塊已經(jīng)被釋放了的內(nèi)存進(jìn)行操作導(dǎo)致的。于是弓乙,把代碼減少到最小的分支末融,僵尸模式開起來,Instrument跑起來暇韧,依然沒能獲得有幫助的信息勾习。一時間,有點一籌莫展懈玻。
? ? ?轉(zhuǎn)機:
? ? ? ?因為當(dāng)天需要發(fā)布一個測試版本巧婶,所以對崩潰問題做了一個簡單的屏蔽處理,當(dāng)晚由同事進(jìn)行了日常的版本發(fā)布。第二天一早艺栈,來到公司英岭,習(xí)慣性的拉取最新代碼,想繼續(xù)分析前一天的問題湿右,卻怎么都重現(xiàn)不了诅妹。通過對比代碼,發(fā)現(xiàn)了一個低級錯誤毅人。
? ? ?案例:
? ? ? ?如果看到上面圖中的這個錯誤提示吭狡,相信即使是剛學(xué)習(xí)OC的小白,也能知道是什么問題堰塌。是的赵刑,方法申明了一個返回類型,而在實現(xiàn)中场刑,并沒有提供返回值般此。于是Xcode檢測到這一錯誤的寫法,給出了錯誤提示牵现。
? ? ? ?然而铐懊,在應(yīng)用工廠的殼工程中,pod入了組件的代碼后瞎疼,再出現(xiàn)如上的寫法科乎,實際的結(jié)果是
? ? ? ?沒有報錯!編譯呢贼急?編譯通過茅茂。執(zhí)行呢?第一次總是能正常通過太抓,之后就會出現(xiàn)內(nèi)存地址錯誤的崩潰警告了空闲。
? ? ?原因分析:
? ? ? ?W君在碼著的時候,看到有類似的方法名走敌,就選擇了拷貝碴倾、粘貼這項我們都快變成本能的動作〉衾觯或許是太依賴Xcode的檢測跌榔,導(dǎo)致一個小的代碼錯誤的發(fā)生,造成了一個嚴(yán)重的崩潰Bug捶障。目前已知:
? ? ? ?①單獨打開組件的工程項目時僧须,Xcode能實時的檢測到文中的代碼編寫錯誤。
? ? ? ?②以錯誤的代碼提交到發(fā)布平臺時项炼,平臺會編譯出錯皆辽,并給出具體錯誤原因柑蛇。
? ? ? ?③在應(yīng)用工廠的殼工程pod入組件代碼后不會實時檢測到錯誤,編譯能正常通過驱闷。(至于為什么沒有報錯,我不得而知空免。如果有應(yīng)用工廠的開發(fā)童鞋空另,或是其他的小伙伴知道原因的黄鳍,請告訴我哈辙诞。)
? ? ? 解決方案:
? ? ? ? 因為不清楚有哪些錯誤是會被忽略的奏瞬,所以為了避免出現(xiàn)類似的錯誤佛南,建議大家在平時開發(fā)過程中坛芽,提交個人代碼前解虱,都應(yīng)該把本地的組件工程項目打開捅儒,單獨編譯查刻,以確認(rèn)是否正常墨坚。(可能有很多小伙伴已經(jīng)是這樣子在做的秧饮,要給你們點個贊)