ios - UIImage 数组到 PDF 转换内存泄漏

标签 ios swift pdf memory memory-leaks

我想将 UIImage 合并到 PDF 文档上,然后将其作为数据发送到 API。

但是在这个方法中,存在很大的内存泄漏!它从 20 MB 开始,然后上升到 390 MB,最后内存稳定在 300 MB。

这个方法有什么问题吗?

fileprivate func mergeImages(_ images: Array<UIImage>)  {
    DispatchQueue.global(qos: .utility).sync {
        let width: CGFloat = 768
        let height: CGFloat = 1024
        let pageSize = CGSize(width: width, height: height);
        let pageFrame = CGRect(x: 0, y: 0, width: width, height: height);
        let pdfData = NSMutableData()

        UIGraphicsBeginPDFContextToData(pdfData, pageFrame, nil)
        let ctx = UIGraphicsGetCurrentContext()

        for i in 0 ..< images.count {
            autoreleasepool {
                let jpegData = UIImageJPEGRepresentation(images[i].resize(toSize: pageSize)!, 0.8)
                let dp = CGDataProvider(data: jpegData! as CFData)
                let cgImage = CGImage(jpegDataProviderSource: dp!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)

                UIGraphicsBeginPDFPage()
                ctx?.translateBy(x: 0, y: height)
                ctx?.scaleBy(x: 1.0, y: -1.0)
                ctx?.draw(cgImage!, in: pageFrame)
            }
            //image.drawInRect(pageFrame)
        }

        UIGraphicsEndPDFContext()
        let d = pdfData as Data
        self.completion?(d)
    }        
}

最佳答案

请尝试对这些对象使用CGRelease方法

let jpegData = UIImageJPEGRepresentation(images[i].resize(toSize: pageSize)!, 0.8)
let dp = CGDataProvider(data: jpegData! as CFData)
let cgImage = CGImage(jpegDataProviderSource: dp!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)

因为我对自动释放池稍后释放那些昂贵的对象有疑问。

关于ios - UIImage 数组到 PDF 转换内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392077/

相关文章:

ios - 根据其原始纯文本状态创建 UIButton 属性标题

swift - 如何判断文件或目录是否可以在 OSX 中重命名?

r - 将图形分开打印到 PDF 文件并同时输出 R Markdown

java - 使用java将PDF转图像

ruby - Ruby 的 pdftk 包装器

ios - 导航栏比 View 消失得更快

ios - 加载更多后快速滚动到顶部不起作用

ios - 在 UICollectionView 中点击位置后识别单元格

ios - 无法将类型 'Swift._ContiguousArrayStorage<Swift.AnyObject>' 的值转换为 'NSMutableArray'

ios - 从 api 获取图像并在 UIImageView swift 中显示它们