2

我有一个加载 pdf 图像数据的 UIImageView 视图的子类,这样我就可以在我的视图中拥有一个与分辨率无关的图形。对于既定目的效果很好,但是根据仪器泄漏配置文件,我会因此而发生内存泄漏。

下面是我认为应该对泄漏负责的代码。我正在努力追查问题,但我对如何查明问题有点模糊。

- (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()];
}
4

1 回答 1

1

你忘记打电话了UIGraphicsEndImageContext()。将您的代码更改为:

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

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

EDIT2:请参阅有关对象分配的附加屏幕截图。您可以看到类型和当前金额及其从多到少的顺序。

在此处输入图像描述

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

EDIT4:代码已上传到:这里(直到 5 月 28 日我才能查看)

EDIT5:问题是 pageRef 从未发布过。所以:

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

CGPDFPageRelease(pageRef);

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

- (void)dealloc
{
    CGPDFPageRelease(pageRef);
}
于 2013-05-15T13:04:08.553 回答