最近上架的APP [ 6F ] , 为了优化性能,修改了上百处代码。突然,在某种情况下,界面全部卡死,没有任何异常抛出, 也没有任何死锁或死循环,最奇怪的是主线程run loop还正常运行,但是,整个界面没有任何反应。
这种无任何出错或异常提示的bug真是要了老命啊!!!!!!
经过一天一夜的艰苦抗战,分析每一个变量数据,疑神疑鬼的做了几十种可能性猜测,可是每一步断点调试都是没有任何问题。也许你会说,那一直调试到出现卡住的地方啊,可是,关键是调试的代码没有任何地方出现卡住的现象,一路通畅,就是界面仿佛冻结住一般,并且!还能响应触摸事件。
甚至恢复了历史代码,做代码差异化比较( 这种方法真是狗急跳墙的方法,这么多年经验告诉我,这种方法找到bug的可能性微乎其微)。
在极其深度的一行行代码研究后( 几乎涉及到2000多行代码,每一行都仔细分析),最终!!!找到一个fat finger的错误:
这里有一个自己写的宏:
_forbid_animation_begin
它主要目的是取消iOS对图层设置颜色,线条等属性时系统自动产生的动画,提高效率。
这个宏我是这样写的:
它是系统定义的一个事务,我自己写的这个宏必须要成对出现
_forbid_animation_begin
_forbid_animation_end
而我恰恰粗心忘记了 _forbid_animation_end
也就意味着代码中出现了系统的[CATransaction begin] ( 也就是告诉系统,现在开始做CALayer的变化事务了。。。),但是最终没有事务的提交。也就导致后面所有对图层的操作,系统都认为是一个未完成的事务,也就仿佛整个屏幕被“冻结”了一般。。。。