一次拷贝粘贴引发的崩溃
故事要从一个崩溃的Bug说起。某日,W君写好了一个方法提交给同事调用,不久同事反馈,有概率性的出现崩溃。纳尼,崩溃!二话不说,开始了问题排查五万里的路程。
重现:
很快找到了重现步骤,经过观察,不是每次操作都会出现崩溃,尤其是第一次操作都不会出现崩溃。而崩溃时Xcode只显示了如下的内存地址错误,没有更具体的原因。
看起来,像是对某块已经被释放了的内存进行操作导致的。于是,把代码减少到最小的分支,僵尸模式开起来,Instrument跑起来,依然没能获得有帮助的信息。一时间,有点一筹莫展。
转机:
因为当天需要发布一个测试版本,所以对崩溃问题做了一个简单的屏蔽处理,当晚由同事进行了日常的版本发布。第二天一早,来到公司,习惯性的拉取最新代码,想继续分析前一天的问题,却怎么都重现不了。通过对比代码,发现了一个低级错误。
案例:
如果看到上面图中的这个错误提示,相信即使是刚学习OC的小白,也能知道是什么问题。是的,方法申明了一个返回类型,而在实现中,并没有提供返回值。于是Xcode检测到这一错误的写法,给出了错误提示。
然而,在应用工厂的壳工程中,pod入了组件的代码后,再出现如上的写法,实际的结果是
没有报错!编译呢?编译通过。执行呢?第一次总是能正常通过,之后就会出现内存地址错误的崩溃警告了。
原因分析:
W君在码着的时候,看到有类似的方法名,就选择了拷贝、粘贴这项我们都快变成本能的动作。或许是太依赖Xcode的检测,导致一个小的代码错误的发生,造成了一个严重的崩溃Bug。目前已知:
①单独打开组件的工程项目时,Xcode能实时的检测到文中的代码编写错误。
②以错误的代码提交到发布平台时,平台会编译出错,并给出具体错误原因。
③在应用工厂的壳工程pod入组件代码后不会实时检测到错误,编译能正常通过。(至于为什么没有报错,我不得而知。如果有应用工厂的开发童鞋,或是其他的小伙伴知道原因的,请告诉我哈。)
解决方案:
因为不清楚有哪些错误是会被忽略的,所以为了避免出现类似的错误,建议大家在平时开发过程中,提交个人代码前,都应该把本地的组件工程项目打开,单独编译,以确认是否正常。(可能有很多小伙伴已经是这样子在做的,要给你们点个赞)