调整大小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!
}
}
答
问题是这样的:
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
就是这样!谢谢。 – Thoms