Недостаточно памяти в цикле for swift (4)
Я перебираю все страницы в PDFDocument (более 200 страниц), но приложение вылетает с
Сообщение от отладчика: прекращено из-за проблемы с памятью
Размер pdf составляет около 4 МБ, но каждая итерация цикла увеличивает объем памяти примерно на 30 МБ. Что не кажется мне правильным. Мне удалось определить, где в моем коде используется память, просто не знаю, как вернуть ее. Пробовал устанавливать переменные в ноль, но без эффекта. Пробовал код в цикле 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
снаружи петли
Дальнейшее ОБНОВЛЕНИЕ. Кажется, это .string
метод PDFPage
это увеличивает память до точки сбоя.