我在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 ???
答案 0 :(得分:2)
不要使用
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL);
drawLayer
中的。因为每次调用它都会创建一个新的文档引用。而是在您的视图控制器中创建单个文档引用并每次使用它。
请改用此行
CGPDFPageRelease (page);