开发者社区> 问答> 正文

在使用reuseIdentifier的情况下,UITableview的cell在什么情况下还会被dealloc?

具体情况是,我需要在tableview中加载网络图片。使用了notification的方法发送消息。
但有时候cell太多了,会crash。查看log,发现是有对应的cell在原本应该能接收正常的notification的时候已经被提前dealloc了。
这里疑问有两点:
1.notification center不是应该对observer有索引计数么?为何还会被dealloc?
2.uitableview里面的cell在什么情况下会被dealloc呢?难道是内存不够用?reuseIdentifier的方法应该好使的啊。

网上查了下,对给dealloc的对象发送notification消息的处理,一般是在对象dealloc的时候,注销掉观察者。但是ARC下面是没有dealloc的啊。

向各位大侠求教

展开
收起
a123456678 2016-07-19 17:17:55 2744 0
2 条回答
写回答
取消 提交回答
  • tableview本身被dealloc
    2019-07-17 19:58:37
    赞同 展开评论 打赏
  • 我就回答下第2个问题吧
    cell reuse的话会放入reuse queue中,正常加载不会被dealloc。
    除非tableview dealloc。

    第一个问题 我开始搞错了。你开了ARC,但是observer除了KVO会retain对象,notification不会。模拟内存警告,cell的reuse依旧正常。

    如果你是在cell中加的notification,cell dealloc中remove的notification的话,那notification并没有被remove。我怀疑是observer没选择好,导致最后一个行的cell一个post会导致整个页面所有cell都被通知到,但是此时你又改变了cell,从而导致在dealloc中报错。

    具体问题在哪只有看看代码了,我只是猜想。

    关于queue cell的值我还是在这边给出吧
    reuse queue基本上是一个固定的值,屏幕可见的cell值+1。
    如果你开始初始化5个cell,高度40。此刻queue = 5;
    cell = 10; queue = 10;
    cell = 20; queue = 13;
    cell再改变 queue的值就不会再改变,一直保持最大值,包括内存警告也未改变大小。
    可能我这边的模拟条件有限,不断的模拟内存警告依旧没有出现queue值减少的情况。有机会楼主还是测试下。
    经过测试cell减少,queue会一直保持当前最大值。不会dealloc,所以我开始给的结论有一点是错误的,cell减少不会影响queue。

    cell存在,notification存在,剩下就只有看具体代码了,ARC我从没开启过,是否会导致在内存警告的情况下把一些autorelease的对象给释放掉。加断点仔细调试下吧。

    2019-07-17 19:58:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载