调整大小UIImage时发生内存泄漏

问题描述:

我已阅读有关该主题的多个主题,但我的问题仍然存在。 当我使用以下代码调整图像大小时:调整大小UIImage时发生内存泄漏

extension UIImage { 
    func thumbnailWithMaxSize(image:UIImage, maxSize: CGFloat) -> UIImage { 
    let width = image.size.width 
    let height = image.size.height 
    var sizeX: CGFloat = 0 
    var sizeY: CGFloat = 0 
    if width > height { 
     sizeX = maxSize 
     sizeY = maxSize * height/width 
    } 
    else { 
     sizeY = maxSize 
     sizeX = maxSize * width/height 
    } 

    UIGraphicsBeginImageContext(CGSize(width: sizeX, height: sizeY)) 
    let rect = CGRect(x: 0.0, y: 0.0, width: sizeX, height: sizeY) 
    UIGraphicsBeginImageContext(rect.size) 
    draw(in: rect) 
    let thumbnail = UIGraphicsGetImageFromCurrentImageContext()!; 

    UIGraphicsEndImageContext() 

    return thumbnail 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    let lionImage = UIImage(named: "lion.jpg")! 

    var thumb = UIImage() 

    autoreleasepool { 
     thumb = lionImage.thumbnailWithMaxSize(image: lionImage, maxSize: 2000) 
    } 
    myImageView.image = thumb 
} 

...内存未释放。所以当我浏览多个ViewController时(例如使用PageViewController),我最终得到内存警告,最终应用程序崩溃。 我也尝试通过UIImage(contentsOfFile:path)加载图像,但没有成功。 有什么建议吗?

我注意到你的代码开始两个上下文但只结束一个。

这是我的扩展,它基本上和你的一样。由于我没有记忆问题,看起来可能是这个问题。

extension UIImage { 
    public func resizeToRect(_ size : CGSize) -> UIImage { 
     UIGraphicsBeginImageContext(size) 
     self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     let resizedImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext(); 
     return resizedImage! 
    } 
} 
+0

就是这样!谢谢。 – Thoms

问题是这样的:

UIGraphicsGetImageFromCurrentImageContext() 返回一个自动释放的UIImage。 autorelease池保留这个图像,直到你的代码将控制返回到runloop,而你很久没有这样做。要解决此问题,请在使用之后制作thumb = nil

var thumb = UIImage() 

autoreleasepool { 
    thumb = lionImage.thumbnailWithMaxSize(image: lionImage, maxSize: 2000) 
    let myImage:UIImage = UIImage(UIImagePNGRepresentation(thumb)); 
    thumb = nil 
} 
myImageView.image = myImage 
+0

不幸的是,设置thumb = nil不能解决问题。内存仍然越来越大。只有当我使用原始图像时,才会按预期释放内存。 – Thoms