最近上架的APP [ 6F ] , ?為了優(yōu)化性能,修改了上百處代碼。突然,在某種情況下,界面全部卡死,沒有任何異常拋出, 也沒有任何死鎖或死循環(huán),最奇怪的是主線程run loop還正常運行,但是,整個界面沒有任何反應。
這種無任何出錯或異常提示的bug真是要了老命啊?。。。。?!
經(jīng)過一天一夜的艱苦抗戰(zhàn),分析每一個變量數(shù)據(jù),疑神疑鬼的做了幾十種可能性猜測,可是每一步斷點調(diào)試都是沒有任何問題。也許你會說,那一直調(diào)試到出現(xiàn)卡住的地方啊,可是,關(guān)鍵是調(diào)試的代碼沒有任何地方出現(xiàn)卡住的現(xiàn)象,一路通暢,就是界面仿佛凍結(jié)住一般,并且!還能響應觸摸事件。
甚至恢復了歷史代碼,做代碼差異化比較( 這種方法真是狗急跳墻的方法,這么多年經(jīng)驗告訴我,這種方法找到bug的可能性微乎其微)。
在極其深度的一行行代碼研究后( 幾乎涉及到2000多行代碼,每一行都仔細分析),最終?。。≌业揭粋€fat finger的錯誤:

這里有一個自己寫的宏:
_forbid_animation_begin
它主要目的是取消iOS對圖層設置顏色,線條等屬性時系統(tǒng)自動產(chǎn)生的動畫,提高效率。
這個宏我是這樣寫的:

它是系統(tǒng)定義的一個事務,我自己寫的這個宏必須要成對出現(xiàn)
_forbid_animation_begin
_forbid_animation_end
而我恰恰粗心忘記了?_forbid_animation_end
也就意味著代碼中出現(xiàn)了系統(tǒng)的[CATransaction begin] ( 也就是告訴系統(tǒng),現(xiàn)在開始做CALayer的變化事務了。。。),但是最終沒有事務的提交。也就導致后面所有對圖層的操作,系統(tǒng)都認為是一個未完成的事務,也就仿佛整個屏幕被“凍結(jié)”了一般。。。。