gpt4 book ai didi

ios - 在 Swift 4.2 中生成二维码和制作 PDF 文件后内存泄漏

转载 作者:行者123 更新时间:2023-11-28 11:37:55 26 4
gpt4 key购买 nike

我正在创建一个应用程序,在一个周期结束时生成一个二维码,然后创建一个 PDF 文件。在多次运行该应用程序(测试了将近 5 天)后,该应用程序停止执行其他必需的功能。我发现每次应用程序生成二维码和制作 PDF 时,内存图在应用程序的连续循环中变得越来越高。调试内存图指示 3 处内存泄漏:一次发生在 viewDidAppear 事件中,另一次发生在 createPDF 方法中,第三次发生在 generateQrCode 方法中。每次用户开始新周期时,我都会删除 PDF 文件。我不知道如何处理这些内存泄漏。有人可以帮忙吗?这是代码:

    let html = ""

override func viewDidAppear(_ animated: Bool) {
createPDF()
return
}

func createPDF() {
html = "<div style='display: flex; justify-content: center;'></div>"

generateQrCode(arg: true, completion: { (success) -> Void in
print("QR Code Generated")
let image1 = captureView()
let imageData1 = image1.pngData() ?? nil
let base64String1 = imageData1?.base64EncodedString() ?? ""

if success {
self.html += "<html><body><div style='text-align: center'><p><br></p><p><b><img width='50%' height='20%' src='data:image/png;base64,\(String(describing: base64String1))'/><p><br></p><p><b></b></p></div></body></html>"
weak var webView = WKWebView(frame: self.view.frame)
self.view.addSubview(webView!)
webView!.navigationDelegate = self
webView!.loadHTMLString(html, baseURL: nil)
webView!.isUserInteractionEnabled = false
} else {
print("false")
}
})
}

func generateQrCode(arg: Bool, completion: (Bool) -> ()){
let data = self.dataToQr.data(using: .ascii, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter?.setValue(data, forKey: "inputMessage")
let img = UIImage(ciImage: (filter?.outputImage)!)
self.qrImageView.image = img
completion(true)
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let render = UIPrintPageRenderer()
render.addPrintFormatter(webView.viewPrintFormatter(), startingAtPageAt: 0)

let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi
let printable = page.insetBy(dx: 0, dy: 0)

render.setValue(NSValue(cgRect: page), forKey: "paperRect")
render.setValue(NSValue(cgRect: printable), forKey: "printableRect")

let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)

for i in 1...render.numberOfPages {
UIGraphicsBeginPDFPage();
let bounds = UIGraphicsGetPDFContextBounds()
render.drawPage(at: i - 1, in: bounds)
}

UIGraphicsEndPDFContext();

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
pdfData.write(toFile: "\(documentsPath)/\(UserDefaults.standard.string(forKey: "yourName")!)_\(UserDefaults.standard.string(forKey: "gameName")!)_Kapper.pdf", atomically: true)
print("\(documentsPath)/apper.pdf")
webView.removeFromSuperview()
}

最佳答案

从我所看到的代码来看,你的内存泄漏似乎是由于你对这个闭包中的 self 的强引用造成的

completion: { (success) -> Void in
print("QR Code Generated")
let image1 = captureView()
let imageData1 = image1.pngData() ?? nil
let base64String1 = imageData1?.base64EncodedString() ?? ""

if success {
self.html += "<html><body><div style='text-align: center'><p><br></p><p><b><img width='50%' height='20%' src='data:image/png;base64,\(String(describing: base64String1))'/><p><br></p><p><b></b></p></div></body></html>"
weak var webView = WKWebView(frame: self.view.frame)
self.view.addSubview(webView!)
webView!.navigationDelegate = self
webView!.loadHTMLString(html, baseURL: nil)
webView!.isUserInteractionEnabled = false
} else {
print("false")
}
}

这是要做的事情:

  1. 在 Controller 的 viewDidLoad 方法中创建您的 webView,而不是在闭包内,或者在您的 Storyboard上将其设为 IBOutlet。然后使闭包中的 self 引用成为弱引用,如下所示。
generateQrCode(arg: true, completion: { [weak self] (success) -> Void in
print("QR Code Generated")
let image1 = captureView()
let imageData1 = image1.pngData() ?? nil
let base64String1 = imageData1?.base64EncodedString() ?? ""

if success {
self?.html += "<html><body><div style='text-align: center'><p><br></p><p><b><img width='50%' height='20%' src='data:image/png;base64,\(String(describing: base64String1))'/><p><br></p><p><b></b></p></div></body></html>"
self?.webView.navigationDelegate = self
self?.webView.loadHTMLString(html, baseURL: nil)
self?.webView.isUserInteractionEnabled = false
} else {
print("false")
}
})

这应该有效。让我知道结果如何。

有关更多上下文,请查看以下链接: How to Correctly handle Weak Self in Swift Blocks with Arguments

Block retain cycles in Swift?

https://medium.com/@sergueivinnitskii/most-common-memory-leak-trap-in-swift-4565dbae5445

P.S:我已经很多年没有回答 StackOverflow 的问题了。 :)

关于ios - 在 Swift 4.2 中生成二维码和制作 PDF 文件后内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com