【问题标题】:how to resize image properly without memory warning如何在没有内存警告的情况下正确调整图像大小
【发布时间】:2015-06-09 09:09:28
【问题描述】:

我没有在文档目录中存储图像(例如:考虑 60+)。我必须在表格视图中显示所有这些图像。这些图片很大,所以我根据这个链接调整图片大小http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

我在 cellforrow 中编写的代码是:

@autoreleasepool {

            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
            dispatch_async(queue, ^{


                    NSString *folderPath = [self getEduCurrentDiractoryPath];
                    NSString *filePath = [folderPath stringByAppendingPathComponent:[message.internalUrl.absoluteString lastPathComponent]];
                    NSLog(@"currentDirectoryPath %@",filePath);

                    dispatch_sync(dispatch_get_main_queue(), ^{

                        cell.message.thumbnail = [[UIImage imageWithContentsOfFile:filePath] resizedImage:CGSizeMake(210, 170) interpolationQuality:kCGInterpolationLow];

                    });
            });
        }

现在,当我检查 INSTRUMENTS 以查看 ALLOCATIONS 并试图找到内存警告时,它会显示以下结果:

所以在这里你可以看到 resizeimage:interpolationQuality 方法显示 168MB 分配,其中我的项目 ARC 已打开,我也将该代码放入 @autoreleasepool.. 但它没有释放分配的内存......强>

任何人都可以帮助我如何在没有收到内存警告的情况下正确调整图像大小,或者有人可以指出我在哪里犯了错误..任何帮助将不胜感激..!!!谢谢..

【问题讨论】:

  • 没有目的使用异步块来读取图像的路径。它的操作占用了一般执行时间的 000001%。代码中最繁琐和最耗时的操作是裁剪操作。所以,我建议你把: UIImage *croppedImage = [[UIImage imageWithContentsOfFile:filePath] resizedImage:CGSizeMake(210, 170) interpolationQuality:kCGInterpolationLow];在异步块中并获取图像: cell.message.thumbnail = croppedImage;在主线程中。并尝试将@autoreleasepool 替换为异步块。
  • 并通过 Instrument Allocations 检查性能。如果可以,请尝试将其完全删除并检查 Instruments 中的差异。
  • 谢谢..我也尝试过这个选项...使用建议的代码..情况变得更糟...
  • 在这种情况下,您的裁剪方法可能已经解决了问题。也许你没有发布一些 CoreFoundation 对象。尝试在几个没有异步块的图像上测试,看看问题是否仍然存在(内存释放与否)

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


【解决方案1】:

试试这个。这里 imgProf 是我的图片名称。

imgProf = [self imageWithImage:imgProf scaledToSize:CGSizeMake(400, 400)];

这是我创建的用于调整图像大小的函数。

- (UIImage*)imageWithImage:(UIImage*)image
              scaledToSize:(CGSize)newSize;
{
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

【讨论】:

    【解决方案2】:

    不要在 cellforrow 方法中编码,你应该在 reloadData 之前完成你的缩略图。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2014-10-29
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多