首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决CFData (存储)内存的增加?

如何解决CFData (存储)内存的增加?
EN

Stack Overflow用户
提问于 2013-01-31 07:27:35
回答 2查看 1.1K关注 0票数 3

我有下面的代码来阅读PDF页面。

问题是每次我读一页的仪器分析给我大约1MB的CFData (商店)?任何帮助都是非常感谢的。

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-23 07:05:29

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

代码语言:javascript
复制
CGPDFDocumentRelease(pdfDoc);  

如果没有,则将所有已分配的页面保存在问题中。

票数 2
EN

Stack Overflow用户

发布于 2013-04-22 18:29:17

我也有同样的问题,在寻找答案的时候发现了你的问题。

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

使用_bridge强制转换在NSURL *pdfURL上解决了这个问题。

我认为这个答案在解释桥接转换方面做得很好:ARC and bridged cast

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

代码语言:javascript
复制
- (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);
}

希望这能帮到别人!

凯文

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14620539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档