我已经检查了很多问题,他们建议释放并重新创建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 ???
我已经试过了,这是因为该CGContextDrawPDFPage(CTX,页);将保持缓存,并使内存越来越大,直到内存警告和崩溃 – Lunayo
你试过什么? CGPDFDocumentRef应该被创建一次..它需要很多内存 – DivineDesert
把CGPDFDocumentRef放在视图控制器中,然后传递给视图和渲染。但是CGContextDrawPDFPage(ctx,page);不断显示仪器泄漏和内存增加超时。并在此链接http://stackoverflow.com/questions/3889634/fast-and-lean-pdf-viewer-for-iphone-ipad-ios-tips-and-hints/3890161#3890161,我被告知释放和每次都重新绘制图层? – Lunayo