具体情况是,我需要在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的对象给释放掉。加断点仔细调试下吧。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。