@Hariprasad У меня немного с тобой такая же проблема. И я не могу найти никаких решений там. Некоторые говорят, что это ошибка фреймворка, другие выпускают, но я думаю, что мой выпустил все. У меня нет утечек или чего-то еще, и все равно в какой-то момент произойдет сбой. Вы нашли решение для этого?

итателя PDF я хочу подготовить документ, сделав «скриншоты» каждой страницы и сохранив их на диск. Первый подход

CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL);
for (int i = 1; i<=pageCount; i++) 
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];      
  CGPDFPageRef page = CGPDFDocumentGetPage(document, i);
  ...//getting + manipulating graphics context etc.
  ...
  CGContextDrawPDFPage(context, page);
  ...
  UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
  ...//saving the image to disc 
  [pool drain];
}
CGPDFDocumentRelease(document);

Это приводит к большому количеству памяти, которая, кажется, не освобождается после первого запуска цикла (подготовка 1-го документа), но больше не освобождает память при дополнительных запусках:

MEMORY BEFORE:          6 MB
MEMORY DURING 1ST DOC: 40 MB
MEMORY AFTER 1ST  DOC: 25 MB 
MEMORY DURING 2ND DOC: 40 MB
MEMORY AFTER 2ND  DOC: 25 MB
....

Изменение кода на

for (int i = 1; i<=pageCount; i++) 
{
  CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL);
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];      
  CGPDFPageRef page = CGPDFDocumentGetPage(document, i);
  ...//getting + manipulating graphics context etc.
  ...
  CGContextDrawPDFPage(context, page);
  ...
  UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
  ...//saving the image to disc 
  CGPDFDocumentRelease(document);
  [pool drain];
}

изменяет использование памяти на

MEMORY BEFORE:          6 MB
MEMORY DURING 1ST DOC:  9 MB
MEMORY AFTER 1ST  DOC:  7 MB 
MEMORY DURING 2ND DOC:  9 MB
MEMORY AFTER 2ND  DOC:  7 MB
....

но это явно шаг назад в производительности.

Когда я начинаю читать PDF (позже, другой поток), в первом случае больше не выделяется память (остается на уровне 25 МБ), тогда как во втором случае объем памяти увеличивается до 20 МБ (с 7).

В обоих случаях, когда я удаляюCGContextDrawPDFPage(context, page); Память строк (почти) постоянна и составляет 6 МБ во время и после всех подготовительных работ.

Кто-нибудь может объяснить, что там происходит?

Ответы на вопрос(1)

Решение Вопроса

и у вас очень мало контроля над этим, за исключением - как вы уже сделали - выпуска документа и его перезагрузки с диска.

Причина, по которой вы не видите много выделений при удалении вызова CGContextDrawPDFPage, заключается в том, что Quartz загружает ресурсы страницы лениво. Когда вы просто вызываете CGPDFDocumentGetPage, все, что происходит, это то, что он загружает некоторые базовые метаданные, такие как ограничивающие рамки и аннотации (очень маленькие в памяти).

Шрифты, изображения и т. Д. Загружаются только тогда, когда вы фактически рисуете страницу, но затем они сохраняются в течение относительно длительного времени во внутреннем кэше. Это сделано для ускорения рендеринга, потому что ресурсы страницы часто распределяются между несколькими страницами. Кроме того, довольно часто визуализировать страницу несколько раз (например, при увеличении). Вы заметите, что визуализация страницы выполняется значительно быстрее.

 otakuProgrammer05 окт. 2012 г., 09:55
@Hariprasad У меня немного с тобой такая же проблема. И я не могу найти никаких решений там. Некоторые говорят, что это ошибка фреймворка, другие выпускают, но я думаю, что мой выпустил все. У меня нет утечек или чего-то еще, и все равно в какой-то момент произойдет сбой. Вы нашли решение для этого?
 Kai Huppmann13 янв. 2011 г., 14:52
Спасибо, имейте смысл для меня, поэтому я отметил это как "правильный", фактически не доказывая это.
 Hariprasad20 апр. 2012 г., 10:22
Привет, омз. Спасибо за подробное объяснение. У меня похожая проблема, использование памяти резко возрастает, когда я продолжаю рендеринг страниц, и приложение падает после некоторого времени. Я использую отдельный PDFDocument для каждой страницы (содержит только один страница), которая создается и публикуется в drawLayer: inContext: method.please дать мне предложение, чтобы избежать этого автоматического кэширования содержимого страницы и уменьшить использование памяти.

Ваш ответ на вопрос