UITableView调用reloadData不刷新的Bug

    今天做项目的时候遇到一个问题,就是我们在AppDelegate中加载了两个view视图,都包含UITableView,一个当前可见(AView),一个当前不可见(BView)。当在可见(AView)的View中选择Cell的时候会同步到BView中。


    恩……我们在模拟器上调试程序的时候一切正常,但是使用版本为ios 4.x & 5.x & 6.x的iPhone 4时都会出现选到大于6条数据的时候,BView里只显示少量或者干脆没有数据。我们打断点的时候得知NSArray中数据存在并没有丢失,而且iPhone 4S调试也正常,仅仅只是iPhone4有问题,这就比较奇怪。


    首先我们认为这个Bug属于内存硬件问题,因为模拟器和4S一切正常,所以排除逻辑问题,我们认为是左边的Cell过多,导致系统内存吃紧回收了隐藏的BView视图中的对象。可是通过分析Log和设置断点,我们发现系统并没有上报关于Memory low的相关信息,而且也没有调用viewDidUnload和didReceiveMemoryWarning。所以最终我们排除了内存问题。

    这样开来只能是逻辑问题了,但是不科学的是逻辑问题为什么模拟器和4s没法复现?于是在大量的代码优化和调试之后,我们终于定位到BView数据存在问题的原因是调用了BView中UITableView的reloadData,但是没有回调其Delegate的numberOfRowsInSection和CellForRow,所以导致界面没有更新。


    然后360了一下,发现有很多人遇到了类似的问题,至少我们的原因是在一个子线程中调用了reloadData,所以导致概率没有刷新UITableView。解决的办法很简单,就是把reloadData perform到主线程里就可以了。


    这个事情虽然解决了,但是需要注意的是:

    1.在安卓中子线程是不能修改UI的,在IOS中应该也不行。虽然系统没有报错且可以正常运行,但是以后写代码还需要尽量注意。

    2.viewDidUnload不仅在视图release的时候会调用,在内存吃紧的时候同样会调用

    3.这个Bug我们只能暂且认为是iPhone4的CPU太挫了,子线程高速计算不及时导致的Bug。不管怎么说这问题是代码逻辑问题。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值