我有一个应用程序可以显示图像并将其缩放到一定的大小。 以下是缩放的代码:
static func scaledImage(originalImage image: UIImage, scaledToSize size: CGSize) -> UIImage {
UIGraphicsBeginImageContextWithOptions(size, true, 0.0)
image.drawInRect(CGRectMake(0, 0, size.width, size.height))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
以下是对函数的调用:
for i in 0 ..< images.count{
if let data = images[i].imageData, let originalImage = UIImage(data: data) {
previewImage = scaledImage(originalImage: originalImage, scaledToSize: desiredSize)
}
}
该应用程序崩溃了50张图片 当我使用仪器查找内存分配的位置时,它告诉我这行分配960 MB: image.drawInRect(CGRectMake(0,0,size.width,size.height))
这是相当多的记忆。
所以我的问题是这里做错了什么? 如何解决内存泄漏问题。
我搜索了很多关于如何缩放图像的例子,但它们或多或少相同。没有关于内存管理的例子,由于我没有很多图像处理经验,我不知道如何解决这个问题。
这里的任何帮助将不胜感激。 提前致谢
答案 0 :(得分:3)
你必须自动释放对scaledImage的调用。
autoreleasepool {
previewImage = scaledImage(originalImage: originalImage, scaledToSize: desiredSize)
}
答案 1 :(得分:0)
如果您进行成百上千次操作,将会看到“ UIGraphicsGetImageFromCurrentImageContext”将保留在内存中,直到代码将控制权返回给运行循环为止,这可能不会很长时间了。当iOS决定您的应用使用过多内存时,这可能会导致崩溃。
这是自动释放池代码的实现:
func scaledImage(originalImage image: UIImage, scaledToSize size: CGSize) -> UIImage {
return autoreleasepool { () -> UIImage in
UIGraphicsBeginImageContextWithOptions(size, true, 0.0)
image.drawInRect(CGRectMake(0, 0, size.width, size.height))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
}