2

我正在循环浏览 PDFDocument 中的所有页面(200 多页),但应用程序崩溃

来自调试器的消息:由于内存问题而终止

pdf 的大小约为 4mb,但循环的每次迭代都会使内存上升约 30mb。这对我来说似乎不正确。我已经设法在我的代码中找到内存被使用的位置,只是不确定如何收回它。尝试将变量设置为零但没有效果。尝试了 for 循环中的代码,autoreleaspool{}但没有效果。

@objc func scrapePDF(){

    let documentURL = self.documentDisplayWebView!.url!
    let document = PDFDocument(url: documentURL)
    let numberOfPages = document!.pageCount

    DispatchQueue.global().async {

        for pageNumber in 1...numberOfPages {

           print(document?.page(at: pageNumber)!.string!)

        }
    }
}

更新:解决了.....有点

玩了一下,我发现不是传递PDFDocument对循环内部的引用,而是为每个循环创建一个新实例,这奇怪地解决了内存问题。我不太明白为什么。PDFDocument是一个类而不是一个结构,所以是通过引用传递的。这意味着它只创建一次,然后在我的循环中引用。那么为什么会导致内存问题呢?

@objc func scrapePDF(){

    let documentURL = self.documentDisplayWebView!.url!
    let document = PDFDocument(url: documentURL)
    let numberOfPages = document!.pageCount

    DispatchQueue.global().async {

        for pageNumber in 1...numberOfPages {
           let doc = PDFDocument(url: documentURL)
           print(doc?.page(at: pageNumber)!.string!)

        }
    }
}

虽然上面的代码清除了内存问题,但它的问题是它太慢了。每个循环需要 0.5 秒,并且有 300 多页我不能接受。有什么加快速度的小窍门吗?PDFDocument或者如果从循环外部引用它为什么不归还内存

进一步更新。似乎它正在调用将内存增加到崩溃点的方法.stringPDFPage

4

0 回答 0