2013-05-15 63 views
2

我有一个加载了pdf图像数据的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()]; 
} 
+0

尽管这不是一个答案,你也可以使用UIWebView显示PDF,并处理所有泄漏预防。 –

+0

你有没有试过静态分析仪?它可以显示代码中潜在的泄漏位置。 – Jeepston

+0

@MarkM很有意思。我会研究这一点。你有什么具体的材料可以指向我吗? – Mrwolfy

回答

1

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

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

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

编辑2:请参阅对象分配的附加屏幕截图。您可以查看类型和当前金额以及从大到小的顺序。

enter image description here

EDIT3:一切都失败了创建具有相同的问题示范项目,并张贴在Dropbox的。

EDIT4:代码上传到:here(我不能看着它直到5月28日)

EDIT5:问题是,PAGEREF方法还没有释放。所以:

1)从您的init方法删除这一点,因为它什么都不做:

CGPDFPageRelease(pageRef); 

2,并将其移动到一个新的dealloc方法:

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

谢谢。我改变了代码,但仍然泄漏。 – Mrwolfy

+0

您是否使用在ObjectAlloc中仪器,运行你的应用程序足以让大量的内存泄露,然后看看有什么是越来越泄露 - 为什么样的对象(S)的? –

+0

谢谢。那是“负责任的来电者”吗? – Mrwolfy