我有3个函数,并且内存泄漏排在第三位。...我花了很多时间,尝试了新的ImageRenderer类,问题还是一样。您能帮我解决内存泄漏吗?
我的工作: 1.在第一个函数中,我使用100 UIImage(2000 x 2000 px)进行循环 2.第二步-即时创建新映像并将其保存到磁盘 3.这是绘图功能,我在那里泄漏,在第25张图像上看起来我使用了1 Gb内存并崩溃了。...
fileprivate func startCreatingPages(object: Object,
images: [UIImage],
progress: @escaping (_ percents: Int)->(),
completion: @escaping ()->(),
error: @escaping (_ text: String)->()) {
for i in 0..<images.count {
autoreleasepool {
weak var image = images[i]
let even = i % 2 == 0
//Here is function call where I have a leak
let errorMessage = createPage(object: object,
image: image,
isEven: even,
index: i + 1)
if let errorMessage = errorMessage {
error(errorMessage)
return
} else {
progress(Int(Float(i) / Float(images.count) * 100))
}
}
}
completion()
}
fileprivate func createPage(object: Object,
image: UIImage?,
isEven: Bool,
index: Int) -> String? {
//Leaks in that function call
guard let pageImage = drawImagePage(image, isEven: isEven),
let dataImage = UIImageJPEGRepresentation(pageImage, 0.8) else {
return "Ups...."
}
//commented for debug
//let errorMessage = self.saveData(to: object, data: dataImage, index: index)
return nil
}
fileprivate func drawImagePage(_ image: UIImage?, isEven: Bool) -> UIImage? {
guard let size = image?.size else { return nil }
let newImageRect = calculateImageRect(for: size, isEven: isEven)
UIGraphicsBeginImageContextWithOptions(PageSize.PX.size, true, 1)
let context = UIGraphicsGetCurrentContext()
UIColor.white.setFill()
context?.fill(CGRect(x: 0, y: 0, width: PageSize.PX.size.width, height: PageSize.PX.size.height))
// Here is my leak - I have not any clue why its happens - that image is created in autorelease pool and it is weak...
//Also if I comment that line - code will not leak...
image?.draw(in: newImageRect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
--------------更新 通过在第三个函数中创建
可以解决这种情况let newIm = UIImage(data: UIImageJPEGRepresentation(image, 1))
所以我的上下文没有捕获图像,也没有任何泄漏
但是.....对我来说这是一个糟糕的方式...