2011-11-16 20 views
2

我已经检查了很多问题,他们建议释放并重新创建CGPDFDocumentRef。而我的最终代码是这样的使用CGContextDrawPDFPage绘制PDF页面异常泄漏

- (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 ???

回答

2

不使用

CGPDFDocumentRef PDF = CGPDFDocumentCreateWithURL(pdfURL);

in drawLayer。由于每次调用它都会创建一个新的文档参考。而是在我们的视图控制器中创建一个单独的文档引用并每次使用它。

使用此行,而不是 CGPDFPageRelease (page);

+0

我已经试过了,这是因为该CGContextDrawPDFPage(CTX,页);将保持缓存,并使内存越来越大,直到内存警告和崩溃 – Lunayo

+0

你试过什么? CGPDFDocumentRef应该被创建一次..它需要很多内存 – DivineDesert

+0

把CGPDFDocumentRef放在视图控制器中,然后传递给视图和渲染。但是CGContextDrawPDFPage(ctx,page);不断显示仪器泄漏和内存增加超时。并在此链接http://stackoverflow.com/questions/3889634/fast-and-lean-pdf-viewer-for-iphone-ipad-ios-tips-and-hints/3890161#3890161,我被告知释放和每次都重新绘制图层? – Lunayo