pdf对象创建内存泄漏

时间:2010-07-06 07:55:16

标签: iphone memory-leaks

我有以下代码

NSString *filePath=[[NSString alloc] initWithString:[[NSBundle mainBundle] pathForResource:pdfname ofType:@"pdf" inDirectory:@"appMasterPdf"]]; 
NSURL *url = [NSURL fileURLWithPath:filePath];
[filePath release];

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url);
CGFloat scaleRatio; 
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef context = UIGraphicsGetCurrentContext();
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, pageNumber);
pageRect = CGPDFPageGetBoxRect(page, kCGPDFBleedBox);
width=pageRect.size.width;
height=pageRect.size.height;
if(pageRect.size.width/pageRect.size.height < 1.0) {
    scaleRatio = height/pageRect.size.height;
}
else {
    scaleRatio = width/pageRect.size.width;
}

CGFloat xOffset = 0.0;
CGFloat yOffset = height;
if(pageRect.size.width*scaleRatio<width) {
    xOffset = (width/2)-(pageRect.size.width*scaleRatio/2);
}
else {
    yOffset = height-((height/2)-(pageRect.size.height*scaleRatio/2));
}

CGContextTranslateCTM(context, xOffset, yOffset);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSaveGState(context);
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page,
                                                              kCGPDFBleedBox, CGRectMake(0, 0, pageRect.size.width, pageRect.size.height),
                                                              0, true);
pdfTransform = CGAffineTransformScale(pdfTransform, scaleRatio, scaleRatio);
CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, page);
UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(context);
UIGraphicsEndPDFContext();
UIGraphicsEndImageContext();

CGContextRelease(context);
CGPDFPageRelease(page);
return tempImage;

此函数用于循环

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url); 这些行给我一个内存泄漏。 请帮我 。 Thanx in advanced

2 个答案:

答案 0 :(得分:2)

从CGPDFDocumentCreateWithURL手册中,“你负责使用CGPDFDocumentRelease释放对象。”

所以你需要在完成后调用

CGPDFDocumentRelease(pdf)
。 CG方法的一般约定是,如果名称包含Create,那么将有一个相应的Release方法,你必须调用它。

答案 1 :(得分:2)

由于使用get方法获取页面,因此不应调用CGPDFPageRelease(page)方法。相反,用taskinoor's CGPDFDocumentRelease(pdf)替换该通话,你应该好好去。