【问题标题】:UIImage don't release memoryUIImage 不释放内存
【发布时间】:2014-07-09 12:14:48
【问题描述】:

我在内存管理方面遇到了一个奇怪的问题,这让我很抓狂。我需要异步预加载图像。我有代码

- (void)preloadFinishAnimation
{
    self.animationImages = [NSMutableArray new];
    __weak LearningViewController *weakSelf = self;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        for (int i = 0; i < NUMBER_OF_ANIMATION_FRAMES; i++) {
            UIImage *problemImage = [UIImage imageNamed:[NSString  stringWithFormat:@"success-%d", i]];
            [weakSelf.animationImages addObject:[weakSelf renderedImageFromImage:image]];
            problemImage = nil;
        }
    });
}


- (UIImage *)renderedImageFromImage:(UIImage *)image
{
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    [image drawInRect:rect];
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return renderedImage;
}

我检查了 Instruments,我知道 issueImage 不会释放内存。这是问题图像之一的保留/释放命令。

希望有人知道问题出在哪里!

【问题讨论】:

  • 第一个细节,相信大家都想知道,是:你在用ARC吗?
  • 另外,分配摘要不是显示图像已发布吗?在我看来,每个保留都有一个版本。
  • 首先,如果您使用 ARC,则无需担心 renderImage 实例。否则,您需要在 renderImageFromImage 方法中自动释放此引用。
  • 我正在使用 ARC。不,它没有发布。在最后一行的分配摘要中,RefCt 是 1。我只寻找活动对象。
  • imageNamed: 加载的所有图片都被框架缓存以提高性能。如果你用同名调用两次imageNamed: 更重要的是,内存将在这两个对象之间共享。

标签: ios objective-c memory-management memory-leaks objective-c-blocks


【解决方案1】:

您必须使用imageWithContentsOfFile:initWithContentsOfFile: 而不是imageNamed:,因为imageNamed: 将始终缓存图像,直到系统请求更多内存并因此清除缓存的图像。

【讨论】:

    【解决方案2】:

    UIImage imageNamed:缓存图片并按照自己的时间表释放内存。 使用“imageWithContentsOfFile”:

    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多