Для 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 МБ во время и после подготовки документов.
Кто-нибудь может объяснить, что там происходит?