绘制UIImage时发生内存泄漏

时间:2018-06-24 19:04:49

标签: swift memory-leaks uigraphicscontext image-rendering uigraphicsrenderer

我有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))

所以我的上下文没有捕获图像,也没有任何泄漏

但是.....对我来说这是一个糟糕的方式...

0 个答案:

没有答案