【问题标题】:how to solve CFData (store) memory increase?如何解决CFData(存储)内存增加?
【发布时间】:2013-01-15 05:52:37
【问题描述】:

我有以下代码来阅读 PDF 页面。
问题是每次我阅读仪器分析的页面时都会增加大约 1MB 的 CFData (store)?任何帮助表示赞赏。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context;

context = CGBitmapContextCreate(NULL, 
                                    width, 
                                    height, 
                                    8,
                                    width* 4,
                                    colorSpace, 
                                    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width*2, pageSize.height*2));

CGContextSaveGState(context);
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1);
CGRect rect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
CGRect rectClip = CGContextGetClipBoundingBox(context);
CGAffineTransform transform = aspectFit(rect,rectClip);
CGContextConcatCTM(context, transform);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

CGImageRef image = CGBitmapContextCreateImage(context);
CGContextRelease(context);

UIImage *img = [UIImage imageWithCGImage:image];
CGImageRelease(image);

【问题讨论】:

  • 我想知道增加 1MB 是否是由于为每个页面创建了自动释放的“UIImage”对象?其他所有内容似乎都被明确发布了。
  • 我将创建的图像(上面代码中的“img”)添加到视图后发布
  • 你是从服务器下载数据
  • 你在设备上试过了吗?如果您继续运行此代码,它会崩溃吗?我还建议尝试从模拟器菜单发送内存警告,看看之后是否有变化。

标签: ios objective-c


【解决方案1】:

经过长时间的追踪,我发现问题是我使用完pdf文档后没有关闭它

CGPDFDocumentRelease(pdfDoc);  

如果不是,您将所有分配的页面保留在问题中

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并在搜索答案时发现了您的问题。

    在我的例子中,我将 pdf 页面转换为 jpeg,然后将它们保存到磁盘。我的麻烦似乎在于 CGPDFDocumentRef 和 CFURLRef 的所有权和发布。

    NSURL *pdfURL 上使用 _bridge 为我解决了这个问题。
    我认为这个答案很好地解释了桥接演员:ARC and bridged cast

    XCode 中的分析工具在这些类型的情况下非常有用。

    - (void) drawRect:(CGRect)rect {
        NSURL *pdfURL = [NSURL fileURLWithPath:self.filePath];
    
        CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((__bridge CFURLRef)pdfURL); 
    
        for (int i = 1; i <= (int)CGPDFDocumentGetNumberOfPages(document); ++i){
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
            CGContextClearRect(context, self.bounds);
            CGContextFillRect(context, self.bounds);
    
            CGPDFPageRef pageRef = CGPDFDocumentGetPage(document, i);
    
            CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
    
            CGFloat scale = MIN(self.bounds.size.width / pageRect.size.width, self.bounds.size.height / pageRect.size.height);
    
            CGContextSaveGState(context);
            CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
            CGContextScaleCTM(context, 1.0, -1.0);
            CGContextScaleCTM(context, scale, scale);
    
            CGContextSetInterpolationQuality(context, kCGInterpolationLow);
            CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
            CGContextDrawPDFPage(context, pageRef);
    
            CGContextRestoreGState(context);
    
            CGImageRef image = CGBitmapContextCreateImage(context);
    
            NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@_%i.jpg", self.sourceId, i]];
            [UIImageJPEGRepresentation([UIImage imageWithCGImage:image], 1) writeToFile:jpgPath atomically:YES];
    
            CGImageRelease(image);
        }
    
        CGPDFDocumentRelease(document);
    }
    

    希望这对某人有所帮助!
    凯文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2010-09-08
      • 2015-06-28
      相关资源
      最近更新 更多