Инструмент для определения утечки iOS CGContextDrawPDFPage

Я знаю, что этот вопрос задавался несколько раз, но я не мог решить его для моего конкретного случая. CGContextDrawPDFPage указывается как утечка в приборе утечки. Кроме того, при запуске этого сегмента кода происходит сбой приложения, что, я уверен, связано с проблемами с памятью.

    pdfURLDocument = [[NSURL alloc] initFileURLWithPath: [docsDir stringByAppendingPathComponent:documentName]];
    pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pdfURLDocument);
    [pdfURLDocument release];

    page = CGPDFDocumentGetPage(pdfDocument, 1);
    CGPDFPageRetain(page);

    // determine the size of the PDF page
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
    pdfScaleWidth = (1/((CGFloat) gridSizeDocument)) * self.frame.size.width/pageRect.size.width;
    pdfScaleHeight = (1/((CGFloat) gridSizeDocument)) * self.frame.size.height/pageRect.size.height;
    pageRect.size = CGSizeMake(pageRect.size.width*pdfScaleWidth, pageRect.size.height*pdfScaleHeight);


    // Create a low res image representation of the PDF page        
    UIGraphicsBeginImageContext(pageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // First fill the background with white.
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context,pageRect);

    CGContextSaveGState(context);
    // Flip the context so that the PDF page is rendered
    // right side up.
    CGContextTranslateCTM(context, 0.0, pageRect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    // Scale the context so that the PDF page is rendered 
    // at the correct size for the zoom level.
    CGContextScaleCTM(context, pdfScaleWidth, pdfScaleHeight);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
    CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); 
    CGContextDrawPDFPage(context, page);
    CGContextRestoreGState(context);

    backgroundImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    CGPDFPageRelease(page);

Также я включил CGPDFPageRelease(page); в методе dealloc. Кроме того, было бы полезно добавить, что он отлично работает для небольших документов, но только с большими сбоями. Утечки памяти все еще сохраняются в меньших, как бы то ни было.

2 ответа

Я знаю, что это старый вопрос, но два замечания:

  1. Вы должны выпустить pdfDocument:

    CGPDFDocumentRelease(pdfDocument);
    
  2. Вы не должны выпускать page с CGPDFPageRelease(page)тем не менее, потому что это автоматически выпущенный объект, и вы не являетесь его владельцем (если, конечно, вы не сохранили его с CGPDFPageRetain).

Если вы используете статический анализатор ("Анализ" в меню "Продукт" XCode), он должен указать на обе эти проблемы.

Основная проблема заключается в том, что CGContextDrawPDFPage утечки в версиях iOS до 6.0.

Релиз должен появиться после использования страницы, а не до. Итак, во-первых, двигаться CGPDFPageRelease(page) продлиться в этом блоке кода и посмотреть, поможет ли это. Кроме того, проблема может быть связана с CGPDFDocumentRef хранится в pdf переменная. Если вышеперечисленное не поможет, было бы хорошо, если бы вы показали, как вы получаете ссылку, и где вы ее храните и отпускаете.

Другие вопросы по тегам