Каковы (tf) секреты распределения памяти PDF (CGPDFDocumentRef)

Для 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 МБ во время и после подготовки документов.

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

7
задан Kai Huppmann 12 January 2011 в 12:26
поделиться