内存泄漏在UITableView?
对不起,因为这可能是一个愚蠢的问题......
我正在使用SDWebImage在我的cellForRowAtIndexPath方法的UITableView中显示图片,使用经典
[cell.pointPicture setImageWithURL:[NSURL URLWithString:thePoint.imageURL] placeholderImage:[UIImage imageNamed:POINT_DEFAULT_IMAGE]];
(显示的图片是轻巧的jpgs,只是一些ko,当然,我使用的是dequeueReusableCellWithIdentifier)。
当我用“ Instrument - Allocations ”检查我的应用程序时,只需向下滚动我的UITableView(包含40个包含图片的单元格,有点像Instagram),就可以使用大量的内存! (见截图)
但它似乎是来自coreGraphics库的“ VM ”,尤其是“ VM:CG栅格数据 ”。
所以问题是:
我很抱歉,经过几次网上搜索后,我找不到有关“ 虚拟机:CG光栅数据 ”的任何相关信息......任何想法? 提前致谢 !
我遇到了同样的问题,并找到了根本原因,至少在我的实施中。
根本原因
根本原因是我的表格单元存储了一个强指针,存储在SDWebImage缓存中的图像。 这个强大的指针导致SDWebImage的内存释放函数removeAllObjects
在从iOS接收到内存警告时不释放任何内存。
解决方案1 - 在您的ViewController中保留weak
指针,并且只允许SDWebImage保留一个指向所有UIImage
对象的强指针。
解决方案2 - 实现- (void)prepareForReuse
并将图像指针设置为nil
要测试此解决方案,请运行您的应用程序并模拟内存警告 - 您将能够看到删除的数据
我遇到过同样的问题。 我的问题似乎来自SDWebImage
缓存以外的其他内容,但由于它确实对内存SDWebImage
起了作用,我首先想到缓存可能是我的问题的原因。 但事实并非如此。 这可能是你有同样的问题。 请记住,我正在使用ARC。
Leaks
模板运行分析器,并检查Allocation Summary
中您自己的类的Allocation Summary
。 Leaks
。 所以乐器可以认为一切都好,但仍然可能有泄漏的地方。 通过深入分配你自己的班级,你可以弄清楚发生了什么问题。 Leaks
模板时提供,而不在使用“ Allocations
模板时提供。 我的问题是,我直接从块内引用实例变量和自身,而没有将它们重新分配给__weak
变量。 当在一个块内使用self时,它将自动被ARC保留,有时甚至不会被释放。 弱引用可以防止这种情况发生。
例如,这是错误的:
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[self.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
你应该使用像这样的__weak
引用来调用self:
__weak YourViewControllerClass *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[weakSelf.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
由于我的应用程序使用了很多块,所以我泄漏了很多漏洞, Leaks
仪器无法检测到。 当我修复它们时,内存问题消失了。
我希望这有帮助。
正如在SDWebImage上工作的人员所解释的那样:
SDWebImage
缓存图像正在使用NSCache
。 这是可丢弃的记忆。 请参阅Apple文档,这是非常正常的行为,如果需要,内存将被释放。