Ios 将PDF转换为图像方法中的内存泄漏(非ARC)

Ios 将PDF转换为图像方法中的内存泄漏(非ARC),ios,objective-c,memory-leaks,cgcontext,cgpdfcontext,Ios,Objective C,Memory Leaks,Cgcontext,Cgpdfcontext,我正在维护一家公司的遗留应用程序,并试图减少非ARC项目中的崩溃和内存泄漏。我在一个将PDF文件转换为UIImage的函数中发现了一个巨大的内存泄漏,但我没有足够的图形上下文经验来正确识别所有问题 泄漏内存的方法如下所示: + (UIImage *) convertPDFToImage:(NSURL *)pdfLocation withResolution:(int)resolution withProductKey:(NSString *) productKey { CGPDFDocumen

我正在维护一家公司的遗留应用程序,并试图减少非ARC项目中的崩溃和内存泄漏。我在一个将PDF文件转换为UIImage的函数中发现了一个巨大的内存泄漏,但我没有足够的图形上下文经验来正确识别所有问题

泄漏内存的方法如下所示:

+ (UIImage *) convertPDFToImage:(NSURL *)pdfLocation withResolution:(int)resolution withProductKey:(NSString *) productKey {

CGPDFDocumentRef documentRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfLocation);

if(!CGPDFDocumentIsUnlocked(documentRef))
{
    NSString *hashedPassword = [MD5Hash CreateMD5HashForPDFPasswordUsingProductKey:productKey];
    CGPDFDocumentUnlockWithPassword(documentRef, [hashedPassword UTF8String]);
}

CGPDFPageRef page = CGPDFDocumentGetPage(documentRef, 1); 

CGRect cropBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
int pageRotation = CGPDFPageGetRotationAngle(page);

if ((pageRotation == 0) || (pageRotation == 180) ||(pageRotation == -180)) {
    UIGraphicsBeginImageContextWithOptions(cropBox.size, NO, resolution / 72); 
} else {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(cropBox.size.height, cropBox.size.width), NO, resolution / 72); 
}

CGContextRef context = UIGraphicsGetCurrentContext();  

CGPoint point = CGPointMake(0, 0);
int rotate = CGPDFPageGetRotationAngle(page);
int zoom = 100;
CGContextSaveGState(context);

// Setup the coordinate system.
// Top left corner of the displayed page must be located at the point specified by the 'point' parameter.
CGContextTranslateCTM(context, point.x, point.y);

// Scale the page to desired zoom level.
CGContextScaleCTM(context, zoom / 100, zoom / 100);

// The coordinate system must be set to match the PDF coordinate system.
switch (rotate) {
    case 0:
        CGContextTranslateCTM(context, 0, cropBox.size.height);
        CGContextScaleCTM(context, 1, -1);
        break;
    case 90:
        CGContextScaleCTM(context, 1, -1);
        CGContextRotateCTM(context, -M_PI / 2);
        break;
    case 180:
    case -180:
        CGContextScaleCTM(context, 1, -1);
        CGContextTranslateCTM(context, cropBox.size.width, 0);
        CGContextRotateCTM(context, M_PI);
        break;
    case 270:
    case -90:
        CGContextTranslateCTM(context, cropBox.size.height, cropBox.size.width);
        CGContextRotateCTM(context, M_PI / 2);
        CGContextScaleCTM(context, -1, 1);
        break;
}

// The CropBox defines the page visible area, clip everything outside it.
CGRect clipRect = CGRectMake(0, 0, cropBox.size.width, cropBox.size.height);

CGContextAddRect(context, clipRect);
CGContextClip(context);

CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(context, clipRect);

CGContextTranslateCTM(context, -cropBox.origin.x, -cropBox.origin.y);

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

CGContextDrawPDFPage(context, page);    

UIImage *pageImage = UIGraphicsGetImageFromCurrentImageContext(); 

CGContextRestoreGState(context);
UIGraphicsEndImageContext();

CGPDFPageRelease(page);
CGPDFDocumentRelease(documentRef);

return pageImage;
}
我已经解决了一个没有发布CGPDFPage的漏洞,但是概要文件显示这个方法仍然有轻微的漏洞


如果您有任何建议,我们将不胜感激

为什么不能选择文件并转到xcode编辑选项并转换为Objective c ARC文件。希望您这样做。而不是尝试修复所有问题。不幸的是,这是一个多年前创建的大型项目。转换为ARC需要花费他们不愿意支付的时间。相反,他们希望在不转换为ARC的情况下修复尽可能多的问题