【问题标题】:pdf object creating memory leakpdf对象创建内存泄漏
【发布时间】:2010-07-06 07:55:15
【问题描述】:

我有以下代码

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;

这个函数在for循环中调用

CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url); 这些行给了我内存泄漏。 请帮我 。高级感谢

【问题讨论】:

    标签: iphone memory-leaks


    【解决方案1】:

    来自 CGPDFDocumentCreateWithURL 的手册,“您负责使用 CGPDFDocumentRelease 释放对象。”

    所以你需要调用

    CGPDFDocumentRelease(pdf)
    完成后。 CG 方法的一般约定是,如果名称中包含 Create,那么您必须调用相应的 Release 方法。

    【讨论】:

    • 我在这个 UIGraphicsEndPDFContext(); 之后添加了UIGraphicsEndImageContext(); 2行
    • 很抱歉我没有得到任何线索:-(
    • pdfTransform = CGAffineTransformScale(pdfTransform, scaleRatio, scaleRatio); CGContextConcatCTM(context, pdfTransform); CGContextDrawPDFPage(上下文,页面); UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext(); CGContextRestoreGState(上下文); UIGraphicsEndPDFContext(); UIGraphicsEndImageContext(); CGPDFDocumentRelease(pdf) 我这样放
    • 只放pdf,不要放页面
    【解决方案2】:

    您不应调用CGPDFPageRelease(page) 方法,因为该页面是使用get 方法获取的。相反,用taskinoor's CGPDFDocumentRelease(pdf) 替换那个电话,你应该很高兴。

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 2012-10-31
      • 2015-02-12
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2012-09-12
      相关资源
      最近更新 更多