编辑此问题以使用更简单的代码版本。 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!)
}
}
}
}
到目前为止,我的解决方案是重新加载didReceiveMemoryWarning
中的PDFDocument
所以我有一个全局变量
var document = PDFDocument()
用它
let pdfURL = ...
document = PDFDocument(url: pdfURL)!
那么如果内存不足
override func didReceiveMemoryWarning() {
let pdfURL = ...
document = PDFDocument(url: pdfURL)!
}