在for循环swift中耗尽内存(4)

时间:2017-12-08 12:40:17

标签: ios swift memory-management swift-structs

我循环浏览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}}方法,它将内存增加到崩溃点。

0 个答案:

没有答案