核心图形内存在显示pdf图像时泄漏

时间:2013-05-15 12:54:49

标签: ios pdf memory-leaks core-graphics

我有一个UIImageView视图的子类,可以加载pdf图像数据,这样我就可以在视图中拥有一个独立于分辨率的图形。根据仪器的泄漏情况,这可以很好地用于所述目的,但我得到内存泄漏。

以下是我认为应该对泄漏负责的代码。我试图追查问题,但我对如何查明问题有点模糊。

- (id)initWithPDFResourceAtPath:(NSString *)path center:(CGPoint)center {
    if ((self = [super init])){
        CGPDFPageRelease(pageRef);
        CGPDFDocumentRef documentRef = CGPDFDocumentCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path]);
        pageRef = CGPDFDocumentGetPage(documentRef, 1);
        CGPDFPageRetain(pageRef);
        CGPDFDocumentRelease(documentRef);
        [self setBounds];
    }
    return self;
}

-(void)setBounds {
    [self setBounds:CGRectApplyAffineTransform(CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox), CGAffineTransformMakeScale(scaleH, scaleV))];
    size = self.bounds.size;
    [self getPDFimage];
}

-(void)getPDFimage {
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextScaleCTM(context, scaleH, scaleV);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
    CGContextDrawPDFPage(context, pageRef);
    [self setImage:UIGraphicsGetImageFromCurrentImageContext()];
}

1 个答案:

答案 0 :(得分:1)

您忘了拨打UIGraphicsEndImageContext()。将您的代码更改为:

UIImage *image = [self setImage:UIGraphicsGetImageFromCurrentImageContext()];
UIGraphicsEndImageContext();
return image;

EDIT1:你的代码有这个pageRef变量 - 是ivar还是静态?如果是ivar,最好在dealloc方法中使用CGPDFPageRelease()释放它。 [它确实应该是一个伊娃]

EDIT2:参见Object Alloc上附带的屏幕截图。您可以看到从最多到最少的类型和当前数量及其排序。

enter image description here

EDIT3:所有其他方法都失败了创建一个具有相同问题的演示项目并将其发布在Dropbox上。

EDIT4:代码已上传到:here(截至5月28日我无法查看)

EDIT5:问题是pageRef还没有发布。所以:

1)从init方法中删除它,因为它什么都不做:

CGPDFPageRelease(pageRef);

2并将其移至新的dealloc方法:

- (void)dealloc
{
    CGPDFPageRelease(pageRef);
}