Утечка памяти при рисовании UIImage
У меня есть 3 функции, и утечка моей памяти находится на третьем месте... Я потратил много времени и попробовал новый класс ImageRenderer, и проблема была той же. Можете ли вы помочь мне исправить утечку памяти.
Что я делаю: 1. В первой функции у меня есть цикл с 100 UIImage (2000 x 2000 px) 2. Во второй - я создаю новое изображение и сохраняю его на диск 3. Это функция рисования, и у меня есть утечка, и она выглядит как на 25-м изображении у меня используется 1 Гб памяти и вылетает....
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
}
-------------- Update Эта ситуация исправлена путем создания в 3-й функции
let newIm = UIImage(data: UIImageJPEGRepresentation(image, 1))
Таким образом, мой контекст не уловил изображение, и утечки больше нет
но..... это плохой способ для моего ума...