【问题标题】:Images not release in memory图像未在内存中释放
【发布时间】:2013-10-16 11:12:49
【问题描述】:

我有带有图像单元格的表格。图像从互联网下载并保存在本地磁盘中。计数 = 200。Tableview 显示此图像。当滚动内容到底部时,出现消息内存警告...已用内存 250 - 300 mb O_O!!!指向不保留的图像的链接。

NSString *cellID = @"cellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
...
NSString* imagePath = [arrayContent objectAtIndex:indexPath.row];
UIImage* image = [[UIImage alloc] initWithContentsOfFile:imagePath];
[cell.imageView setImage:image];

为什么隐藏图片不发布?

【问题讨论】:

  • 使用 Instruments 准确了解您的应用内存在什么时候增加。
  • 分配:VM ImageIO_PNG_Data 281 mb O_o!!!为什么???
  • 想知道为什么 ARC 没有释放 UIImage 对象。您使用的是 ARC 对吗?
  • 当你运行静态分析器时,它会给你任何警告吗?
  • 你需要把代码放在@autoreleasepool{}块中

标签: ios image memory-warning


【解决方案1】:

替换这一行

UIImage* image = [[UIImage alloc] initWithContentsOfFile:imagePath];

用这个检查一次

 UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

【讨论】:

  • 刚刚添加了一个解释它的编辑。如果它被批准,你很快就会看到它。简而言之,第一行代码块永远不会释放内存,因为 ARC 可能已关闭。第二个代码块返回一个自动释放的 UIImage,所以没有泄漏。
  • 如果屏幕上的图像是从 Xib 加载的 - 有没有办法避免 VM ImageIO_PNG_Data 不释放?
  • @Ganapathy thanx 我也收到了同样的警告。现在它解决了。但我的应用程序内存仍在不断增加,并且在一段时间后应用程序崩溃。请看看我的代码,让我知道我做错了什么。为什么内存不释放。 stackoverflow.com/questions/29017579/…
【解决方案2】:

我使用了一个自定义的MSAsyncImageCell 类,它在被 iOS 重用时替换它的图像。它从 URL 异步加载图像,优雅地显示“正在加载”的图像,并在重用于另一个图像时释放内存。如果你愿意,我可以在这里发布代码,但代码有点长。

这是实际加载图像的代码部分。我有来自网络/缓存的图像,所以它是 NSData。

- (BOOL)_loadImageWithData:(NSData *)imageData
{
    UIImage *image = [UIImage imageWithData:imageData];

    // Just in case loading failed.

    if (image)
    {
        // Extra check - don't mix up.
        if ([[self.currentURL absoluteString] isEqualToString:[self.imageURL absoluteString]])
            self.asyncImageView.image = image;

        return YES;
    }

    return NO;
}

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2017-12-22
    • 2012-04-02
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多