我知道这个问题已被问过几次,但我无法解决这个问题。 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(页面);在dealloc方法中。此外,添加它适用于小型文档可能会有所帮助,但只能在大型文档上崩溃。然而,内存泄漏仍然存在于较小的内存中。
答案 0 :(得分:1)
我知道这是一个老问题,但有两个观察结果:
您需要发布pdfDocument
:
CGPDFDocumentRelease(pdfDocument);
你应该不用page
释放CGPDFPageRelease(page)
,因为这是一个自动释放的对象,你不拥有它(当然,除非,你用CGPDFPageRetain
保留了它。
如果您使用静态分析器(Xcode的“产品”菜单上的“分析”),它应指出这两个问题。
根本问题是在6.0之前的iOS版本中CGContextDrawPDFPage
泄漏。
答案 1 :(得分:0)
在页面使用之后,需要发布,而不是之前。首先,将CGPDFPageRelease(page)
移到此代码块中的最后一位,看看是否有帮助。此外,该问题可能与CGPDFDocumentRef
变量中存储的pdf
有关。如果上述方法没有帮助,那么如果您展示如何获得参考,以及保留和释放它的位置,那将是一件好事。