我循环浏览PDF文档中的所有页面(200多页),但应用程序崩溃
来自调试器的消息:由于内存问题而终止
pdf的大小约为4mb,但循环的每次迭代都会将内存大约跳到30mb。这对我来说似乎不对。我已设法找到我的代码中使用内存的位置,但不确定如何将其声明回来。尝试将变量设置为零但没有效果。在autoreleaspool{}
中的for循环中尝试了代码,但没有效果。
@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
,它为什么不给回内存
进一步更新。
它似乎正在调用.string
的{{1}}方法,它将内存增加到崩溃点。