Рисование страницы PDF с использованием CGContextDrawPDFPage Утечка ненормально - PullRequest
2 голосов
/ 16 ноября 2011

Я проверил много вопросов в SO, они предложили выпустить, а затем заново создать CGPDFDocumentRef.И мой окончательный код выглядит так:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
CFURLRef pdfURL = (CFURLRef)_pdfLocation;

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL);

if (CGPDFDocumentIsEncrypted(pdf)) {
    CGPDFDocumentUnlockWithPassword(pdf, (char *)[PDF_PASSWORD UTF8String]);
}

CGPDFPageRef page = CGPDFDocumentGetPage(pdf, _pageNumber);

CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 1.0f);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
CGContextTranslateCTM(ctx, 0.0f, [layer bounds].size.height);

CGContextScaleCTM(ctx, 1.0f, -1.0f);

CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
CGContextScaleCTM(ctx, [layer bounds].size.width / mediaRect.size.width, [layer bounds].size.height / mediaRect.size.height);
CGContextTranslateCTM(ctx, -mediaRect.origin.x, -mediaRect.origin.y);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);    

CGContextDrawPDFPage(ctx, page);


CGPDFDocumentRelease(pdf);

}

Является ли код выше верным способом воссоздания CGPDFDocumentRef?Причина "иногда" вызывает утечку в этой строке CGContextDrawPDFPage (ctx, page);Это происходит, когда я прокручиваю около 10 страниц.И перейдите по этой ссылке Быстрый и Lean PDF Viewer для iPhone / iPad / iOs - советы и подсказки? , я пытался освободить CGPDFDocumentRef всякий раз, когда появляется предупреждение о памяти, но в результате CGPDFDocumentRef не выпускал всекеш, но только недавно выпустила страницу, поэтому память все равно увеличивается.Я думал, что ошибка была исправлена?Как полностью освободить CGPDFDocumentRef ???

1 Ответ

2 голосов
/ 16 ноября 2011

Не использовать

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL (pdfURL);

в drawLayer. Поскольку каждый раз, когда это вызывается, создается новый документ ref. Вместо этого создайте единый документ ref в вашем контроллере представления и используйте его каждый раз.

Используйте эту строку вместо CGPDFPageRelease (page);

...