CGContextDrawPDFPage Leak 100% - PullRequest
       14

CGContextDrawPDFPage Leak 100%

0 голосов
/ 23 сентября 2011

Я пытаюсь нарисовать PDF с CoreGraphics, все работает нормально, но в приборе есть 100% утечка: CGContextDrawPDFPage (ctx, page2); Я выпускаю с CGPDFDocumentRelease (); каждый раз, когда я использую CGPDFDocumentCreateWithURL (); Есть какое-то решение для выпуска: CGContextDrawPDFPage?

  - (void)drawRect:(CGRect)rect
        {
        if (state == 0) {
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextSaveGState(ctx);
        [[UIColor whiteColor] set];
        CGContextFillRect(ctx, CGRectMake(0, 0, rect.size.width, rect.size.height));
        CGContextGetCTM(ctx);
        CGContextScaleCTM(ctx, 1, -1);
        CGContextTranslateCTM(ctx, 45, -rect.size.height);
        CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(((CFURLRef)url));
        CGPDFPageRef page = CGPDFDocumentGetPage(pdf, currentPage);
        CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
        CGContextScaleCTM(ctx, (678) / mediaRect.size.width,
        (rect.size.height )  / (mediaRect.size.height));
        CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
        CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
        CGContextDrawPDFPage(ctx, page);
        CGPDFDocumentRelease(pdf);
        CGContextRestoreGState(ctx);
        }
        else
        {
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextSaveGState(ctx);
        [[UIColor whiteColor] set];
        CGContextFillRect(ctx, CGRectMake(0, 0, rect.size.width, rect.size.height));

        CGContextGetCTM(ctx);
        CGContextScaleCTM(ctx, 1, -1);

        CGContextTranslateCTM(ctx, 6, -rect.size.height);

        CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(((CFURLRef)url));
        CGPDFPageRef page = CGPDFDocumentGetPage(pdf, currentPage);


        CGRect mediaRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
        CGContextScaleCTM(ctx, (497) / mediaRect.size.width,
        (rect.size.height )  / (mediaRect.size.height));

        // draw it
        CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
        CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
        CGContextDrawPDFPage(ctx, page);
        CGPDFDocumentRelease(pdf);
        CGContextRestoreGState(ctx);

        //

        CGContextSaveGState(ctx);

        CGContextGetCTM(ctx);
        CGContextScaleCTM(ctx, 1, -1);

        CGContextTranslateCTM(ctx, 506, -rect.size.height);

        CGPDFDocumentRef pdf2 = CGPDFDocumentCreateWithURL(((CFURLRef)url));
        CGPDFPageRef page2 = CGPDFDocumentGetPage(pdf2, (currentPage + 1));



        CGContextScaleCTM(ctx, (497) / mediaRect.size.width,
        (rect.size.height )  / (mediaRect.size.height));

        CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
        CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
        //Leak 100%
        CGContextDrawPDFPage(ctx, page2);
        CGPDFDocumentRelease(pdf2);
        CGContextRestoreGState(ctx);
        }
    }

И я не знаю почему. Любая идея? Это единственная утечка моего приложения :( Я не вижу, откуда произошла утечка: s

PS: состояние = 0 = книжная ориентация state = 1 = альбомная, поэтому я рисую 2 страницы в альбомной ориентации.

1 Ответ

0 голосов
/ 05 декабря 2011

Похоже, вы не выпускаете экземпляры CGPDFPageRef, полученные из CGPDFDocumentGetPage.

CGPDFPageRelease(page);

Добавьте это для страницы и страницы2 в соответствующих местах.

...