【问题标题】:Drawing PDF page using CGContextDrawPDFPage Leak Abnormally使用 CGContextDrawPDFPage 绘制 PDF 页面泄漏异常
【发布时间】:2011-12-30 03:06:59
【问题描述】:

我在 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???

【问题讨论】:

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


    【解决方案1】:

    不要使用

    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(pdfURL);

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

    改用这一行 CGPDFPageRelease (page);

    【讨论】:

    • 我试过了,正因为如此 CGContextDrawPDFPage(ctx, page);将保持保存缓存并使内存越来越大,直到内存警告和崩溃
    • 你试过什么?? CGPDFDocumentRef 应该创建一次.. 它需要大量的内存
    • 将 CGPDFDocumentRef 放入视图控制器,然后传递给视图进行渲染。但是 CGContextDrawPDFPage(ctx, page);不断显示仪器泄漏,内存增加超时。在这个链接stackoverflow.com/questions/3889634/…中,我被告知每次都要释放并重新初始化来绘制图层?
    • 我现在检查了.. 使用 Instrument.. 我的代码没有泄漏。您需要发布页面而不是文档
    • 每次滑动页面时都会渲染页面。页面是从 cgpdfdocument 获取的,有必要发布吗?您是否尝试过在循环中调用绘图层?
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2015-01-03
    • 2018-04-04
    • 2012-07-24
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多