创建UIImage时内存泄漏

时间:2013-07-17 05:28:27

标签: ios memory-leaks uiimage

我有以下方法在文档目录中获取pdf文件并从中创建缩略图。此方法在两个位置泄漏内存,如注释中所示。由于我使用ARC,我不知道为什么它会泄漏内存。我该怎么解决这个问题。

  + (UIImage*)createPdfThumbnail:(NSString*)pdfFilePath {


        NSURL *targetURL = [NSURL fileURLWithPath:pdfFilePath];
        CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)targetURL);  // 3.0% of memory leak

        CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);//for the first  page
        CGRect aRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
        UIGraphicsBeginImageContext(aRect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, 0.0, aRect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextTranslateCTM(context, -(aRect.origin.x), -(aRect.origin.y));

        CGContextSetGrayFillColor(context, 1.0, 1.0);
        CGContextFillRect(context, aRect);

        CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, aRect, 0, false);
        CGContextConcatCTM(context, pdfTransform);
        CGContextDrawPDFPage(context, page);

        UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); // 97% of memory leak
        CGContextRestoreGState(context);
        UIGraphicsEndImageContext();
        CGPDFDocumentRelease(pdf);
        return thumbnail;

}

修改

-(void)fromJSON:(NSDictionary *)JSON{
    [super fromJSON:JSON];
    self.path = JSON[@"path"];
    //Create and save thumbnail
    if (self.parentSpecSheet != nil){
        @autoreleasepool {
            UIImage* thumbnail = [Utilities createPdfThumbnail:self.path];
            Photo* thumbnailPhoto = [Photo addObject];
            [thumbnailPhoto setDelta:@(0)];
            [thumbnailPhoto setImage:thumbnail];
            [thumbnailPhoto.file setDelta:@(0)];
            self.parentSpecSheet.thumbnail = thumbnailPhoto;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

两个想法:

  1. 当我在iOS5中测试您的代码时,我遇到CGContextDrawPDFPage的重大泄漏(如果您搜索"CGContextDrawPDFPage leak",您会看到大量对此问题的排列的引用)。这似乎是一个已知问题。

    但是,我发现iOS 6中没有明显泄漏上述代码。

  2. 如果你仍然在iOS 6中看到这个漏洞,那么我怀疑问题不在上面的代码中。您是否报告过任何其他泄漏?我还建议您确认拥有此thumbnail的对象已成功自行解除分配(例如,dealloc方法中的日志/断点)。

    不幸的是,当您查看泄漏工具时,它会报告泄漏对象的实例化位置,而不是泄漏发生的位置。您可能想要确认此thumbnail的所有者不是以某种方式保持对它的强引用(例如,所有者,本身,具有保留周期,或类似的东西)。

    < / LI>