PDFKit内存问题ios12

问题描述 投票:5回答:1

编辑此问题以使用更简单的代码版本。 TestPDF是全文,约300页。随着循环运行,它在消耗2gb内存后崩溃。打印后我不需要print语句中的值。但是代码会将其保留在内存中。如何在循环关闭之前清除print语句内容的内存分配?

func loadPDFDocument(){
        let documentURL = Bundle.main.url(forResource: "TestPDF", withExtension: "pdf")!

        if let document = PDFDocument(url: documentURL) {

            for page in 1...document.pageCount {
                DispatchQueue.global().async {
                print(document.page(at: page)!.string!)
                }
            }

        }

    }

我尝试过的解决方案包括autoreleasepool并为每个循环创建一个新的PDFDocument对象并使用它。第二个选项确实释放了内存但速度太慢了。

 func loadPDFDocument(){
        let documentURL   = Bundle.main.url(forResource: "TestPDF", withExtension: "pdf")!

     if let document      = PDFDocument(url: documentURL) {



            for page in 1...document.pageCount {
                 DispatchQueue.global().async {
                  let innerDocument = PDFDocument(url: documentURL)!
                     print(innerDocument.page(at: page)!.string!)
                    }
              }

            }

        }
memory-management swift4 pdfkit
1个回答
0
投票

到目前为止,我的解决方案是重新加载didReceiveMemoryWarning中的PDFDocument

所以我有一个全局变量

 var document =  PDFDocument()

用它

let pdfURL   = ...
     document =   PDFDocument(url: pdfURL)! 

那么如果内存不足

 override func didReceiveMemoryWarning() {
    let pdfURL   = ...
        document =  PDFDocument(url: pdfURL)! 
}
© www.soinside.com 2019 - 2024. All rights reserved.