内存泄漏在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
  • 潜入他们并检查他们如何分配,如果有泄漏。 请注意,由于您正在使用ARC,所以漏泄仪器中不会显示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文档,这是非常正常的行为,如果需要,内存将被释放。

    链接地址: http://www.djcxy.com/p/16921.html

    上一篇: Memory leak in UITableView?

    下一篇: AS3 library for Socket.io