调整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)加载图像没有成功。 有什么build议么?

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

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

 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! } } 

问题是这样的:

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