我想将 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/