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

在使用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的啊。

向各位大侠求教


1. notification center没有retain observer,这一点写个demo很容易验证
2. 个人推测,uitableview维护了一个 "reuse cell" 栈,假如你之前同时显示了10个cell,那么至少 alloc 了10个cell,也就是说栈里有10个cell。当后来屏幕上只需要显示3个cell的时候,那么栈里有7个空闲待用的cell。这个时候如果内存不足,uitableview会把未使用的cell释放掉。当然以上这些纯属个人推测,未经过严格验证。
3.ARC下可以重写dealloc,只是在重写的dealloc里面,不允许执行 [super dealloc];,这个官方文档上有说明,也就是说,你仍然可以重写cell的dealloc方法,在其中remove掉obsever,这个也是必须要做的。


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

【热门文章】
【热门文章】