使用SWIFT在iOS中缩放图像时内存泄漏

时间:2016-04-25 14:49:33

标签: ios swift image-processing memory-management memory-leaks

我有一个应用程序可以显示图像并将其缩放到一定的大小。 以下是缩放的代码:

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))

这是相当多的记忆。

所以我的问题是这里做错了什么? 如何解决内存泄漏问题。

我搜索了很多关于如何缩放图像的例子,但它们或多或少相同。没有关于内存管理的例子,由于我没有很多图像处理经验,我不知道如何解决这个问题。

这里的任何帮助将不胜感激。 提前致谢

2 个答案:

答案 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
    }
}