Quais são (tf) os segredos por trás da alocação de memória PDF (CGPDFDocumentRef)

Para um leitor de PDF, quero preparar um documento tirando 'capturas de tela' de cada página e salvando-as em disco. A primeira abordagem é

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);

Isso resulta em muita memória que parece não ser liberada após a primeira execução do loop (preparando o 1º documento), mas não há mais memória não liberada em execuções adicionais:

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
....

Alterando o código para

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];
}

altera o uso da memória para

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
....

mas é obviamente um retrocesso no desempenho.

Quando começo a ler um PDF (mais tarde, um encadeamento diferente) no primeiro caso, não há mais memória alocada (permanecendo em 25 MB), enquanto no segundo caso a memória sobe para 20 MB (de 7).

Nos dois casos, quando removo oCGContextDrawPDFPage(context, page); a memória de linha é (quase) constante a 6 MB durante e após todas as preparações dos documentos.

Alguém pode explicar o que está acontecendo lá?

questionAnswers(1)

yourAnswerToTheQuestion