【发布时间】: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