1

我知道这个问题已经被问过好几次了,但我无法针对我的特殊情况解决它。CGContextDrawPDFPage 在泄漏工具中被指示为泄漏。此外,当这段代码运行时,应用程序崩溃,我确信这是由于内存问题。

    pdfURLDocument = [[NSURL alloc] initFileURLWithPath: [docsDir stringByAppendingPathComponent:documentName]];
    pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pdfURLDocument);
    [pdfURLDocument release];

    page = CGPDFDocumentGetPage(pdfDocument, 1);
    CGPDFPageRetain(page);

    // determine the size of the PDF page
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    pdfScaleWidth = (1/((CGFloat) gridSizeDocument)) * self.frame.size.width/pageRect.size.width;
    pdfScaleHeight = (1/((CGFloat) gridSizeDocument)) * self.frame.size.height/pageRect.size.height;
    pageRect.size = CGSizeMake(pageRect.size.width*pdfScaleWidth, pageRect.size.height*pdfScaleHeight);


    // Create a low res image representation of the PDF page        
    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // First fill the background with white.
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context,pageRect);

    CGContextSaveGState(context);
    // Flip the context so that the PDF page is rendered
    // right side up.
    CGContextTranslateCTM(context, 0.0, pageRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // Scale the context so that the PDF page is rendered 
    // at the correct size for the zoom level.
    CGContextScaleCTM(context, pdfScaleWidth, pdfScaleHeight);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); 
    CGContextDrawPDFPage(context, page);
    CGContextRestoreGState(context);

    backgroundImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    CGPDFPageRelease(page);

另外,我包括了 CGPDFPageRelease(page); 在 dealloc 方法中。此外,它可能有助于补充它适用于小型文档,但只会在大型文档上崩溃。但是,内存泄漏仍然存在于较小的内存中。

4

2 回答 2

1

我知道这是一个老问题,但有两个观察结果:

  1. 你需要释放你的pdfDocument

    CGPDFDocumentRelease(pdfDocument);
    
  2. 但是,您不应该释放with pageCGPDFPageRelease(page)因为这是一个自动释放的对象并且您不拥有它(当然,除非您使用 保留它CGPDFPageRetain)。

如果您使用静态分析器(Xcode 的“产品”菜单上的“分析”),它应该指出这两个问题。

根本问题是CGContextDrawPDFPage6.0 之前的 iOS 版本中的泄漏。

于 2013-07-17T13:27:28.830 回答
0

发布需要页面被使用之后发布,而不是之前。所以首先,CGPDFPageRelease(page)在这个代码块中移到最后,看看是否有帮助。此外,问题可能与CGPDFDocumentRef存储在pdf变量中有关。如果上述方法没有帮助,最好说明如何获取参考,以及在何处保留和释放它。

于 2012-05-01T10:38:17.023 回答