上个月,公司新上线的APP捕捉到闪退问题,而且频率还挺高的,由于是一款供给自己公司内部使用的APP,业务部门的同事反应比较强烈,最终找到的解决问题的方法很简单,但是真正值得一说的,是寻找问题的过程。
由于没有iOS8的测试手机,只能在xcode中下载的iOS8.1的模拟器,下图是模拟器运行后控制台中展示的闪退错误信息:
UITableview报错从图上的截图,我的第一反应是,那个cell没有定义好,导致了闪退,此后,我对相关的额控制器进行了仔细的排查,但是排查完发现,并没有哪个cell没有按步骤处理。此时想到,可以通过断点的形式,找到出问题的位置。。。。真是浪费了不少时间。
添加断点的位置 添加的断点在以上步骤完成之后,运行APP,效果如下图:
代码闪退的位置此时,更是一头雾水,这句每天都会写的代码,怎么会有问题。。。。
更神奇的是,注释掉这句话之后,竟然可以完美运行。。。。。。。傻眼
于是,开始疯狂百度。。。。这个不是。。。这个。。。不是。。。。这个。。。。不看了。。。百度的答案,貌似没有第二个了。
此时,想出的解决方案有两个:
第一:将cell重写,不适用上面报错的代码,但是内心是多么的抗拒啊。。。这句代码凭什么不能写;
于是选择第二方案:找到闪退原因。
于是有了这段定义tableView的代码:
世上最简单的定义tableview方法运行。。。正常。。。
注释掉一行之后运行
注释一行运行。。。。竟然是OK的。。。。瞎了
难道是tableFooterView造成的闪退?还是因为我没有设置frame造成的?
于是又尝试了下面的情况:
第n个尝试还是闪退。。。
******于是,突然想到难道是初始化的顺序导致的问题?
最终解决办法交换了两个设置的顺序,运行。。。。。完美了。。。
最终找到问题的解决方案尽然是separatorStyle的设置必须在tableFooterView、tableHeaderView之前。
当然,这个问题也只在iOS8上才会出现,但是目前iOS8的市场保有量还是挺大的,应该注意这个问题。至于为什么会出现这个问题,或者是iOS底层出现的什么问题,暂未进行过多的研究,欢迎指导的同学留言交流。
以上,只是个人对于遇到的这个问题以及解决过程的简单记录,希望能够帮到遇到同样问题的同行们。
第一次发,不喜勿怪,手下留情,谢谢!
-------------------更新 20171015----------------
二楼的小伙伴提供了新的解决办法
“把separator放在cell的注册之后,不管separator和tableFooterView的先后顺序,就能顺利执行”
这个方案尝试之后也是可以避免闪退发生的,但是原本提供的方法在哪个版本上仍然闪退还需要再次验证,尚未发现
网友评论
“把separator放在cell的注册之后,不管separator和tableFooterView的先后顺序,就能顺利执行”
我试了你说的正确的顺序,separator先 tableFooterView后,一样报错,崩在separator上。
然后我把separator放在cell的注册之后,不管separator和tableFooterView的先后顺序,就能顺利执行。
这个问题我也是纳闷。。