首页 > 开发 > iOS > 正文

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

2017-09-08 14:03:29  来源:网友分享

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

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

向各位大侠求教

解决方案

我就回答下第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的对象给释放掉。加断点仔细调试下吧。