使用CGContextDrawPDFPage绘制PDF页面异常泄漏

时间:2011-11-16 05:16:24

标签: iphone objective-c pdf core-graphics quartz-graphics

我在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页时发生。并按照此链接Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?,我已经尝试在发生内存警告时释放CGPDFDocumentRef,但结果是CGPDFDocumentRef没有释放所有缓存,但只发布了最近的页面,所以内存仍然一直在增加。我以为这个bug已经修好了?如何完全释放CGPDFDocumentRef ???

1 个答案:

答案 0 :(得分:2)

不要使用

  

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL);

drawLayer中的

。因为每次调用它都会创建一个新的文档引用。而是在您的视图控制器中创建单个文档引用并每次使用它。

请改用此行 CGPDFPageRelease (page);