直接进入主题:
问题现象:一个tabview各种联动复杂交互的页面突然被测试提一个bug过来,问题现象1、说在iOS10系统下此页面提示文字在点击展开按钮后,展开按钮在提示文字中间,cell高度刷新了,但是按钮位置仍然没变化;问题现象2、在加载出来页面之后,上下滑动,有些cell在还未离开可视区域就消失了。。。
问题一:断点跟逻辑,发现cell确实刷新了高度,并且逻辑并无异常。然后打开分层视图,发现在此indexPath位置存在两个cell,按正常逻辑来说这是不可能的,一个位置怎么可能加载出来了两个cell,所以分析是不是cell重用机制出问题了。每一次刷新cell缓存池中拿到的cell地址不同,然后上一次加载的cell没释放引起。然后测试不使用重用机制和注册cell标识符唯一
//不使用重用机制
UITableViewCell *cell = [tableView cellForRowAtIndexPath:@"cell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.backgroundColor = [UIColor clearColor]; return cell;
仍然不行,分层结构显示仍是重复加载多个,没办法一步一步的跟逻辑吧
最终在消失前瞬间,断点中发现有一个部分cell刷新的操作。然后果断先屏蔽刷新操作,再测试,问题现象消失。
然后就开始分析为什么部分cell刷新后,再对已经加载的cell做刷新会出现加载多个问题?
最终经过打印cell的相关日志,发现如果局部刷新后,tableview对原有存在未刷新的cell引用没了,也就是通过cellForRowAtIndexPath方法,拿不到已经加载过的cell了,所以后续再对加载过的cell做操作,就会重新加载新的cell了,这就出现了在分层页面上看到加载多个cell的问题,其实实际引用的还是只有一个。
注释掉局部刷新后,问题二现象也没了,具体原因仍需分析,为何局部刷新后
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_remitAcctIndexPath.row inSection:_remitAcctIndexPath.section];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
tableview失去引用。
欢迎定位原因的来补充修改,以上分析只是个人观点,如有不对欢迎指正。