Pergunta

Alguém pode me dizer o que estou fazendo de errado aqui? Eu uso esse método para virar as páginas em um PDF. Mas algo no código parece não ser lançado corretamente, porque toda vez que eu puxo uma página PDF que contém uma imagem que minha pegada de memória aumenta. Sou bastante novo na CoreGraphics e não posso para a vida de mim descobrir onde esse método vazaria memória.

-(UIImage *)pageAtIndex:(NSInteger)pageNumber withWidth:(CGFloat)width andHeight:(CGFloat)height {
    if((pageNumber>0) && (pageNumber<=pageCount)) {
        CGFloat scaleRatio; // multiplier by which the PDF Page will be scaled

        UIGraphicsBeginImageContext(CGSizeMake(width, height)); 
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGPDFPageRef page = CGPDFDocumentGetPage(pdf, pageNumber);
        CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFBleedBox);

        //Figure out the orientation of the PDF page and set the scaleRatio accordingly
        if(pageRect.size.width/pageRect.size.height < 1.0) {
            scaleRatio = height/pageRect.size.height;
        } 
        else {
            scaleRatio = width/pageRect.size.width;     
        }

        //Calculate the offset to center the image
        CGFloat xOffset = 0.0;
        CGFloat yOffset = height;
        if(pageRect.size.width*scaleRatio<width) {
            xOffset = (width/2)-(pageRect.size.width*scaleRatio/2);
        }
        else {
            yOffset = height-((height/2)-(pageRect.size.height*scaleRatio/2));  
        }
        CGContextTranslateCTM(context, xOffset, yOffset);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSaveGState(context);
        CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFBleedBox, CGRectMake(0, 0, pageRect.size.width, pageRect.size.height), 0, true);
        pdfTransform = CGAffineTransformScale(pdfTransform, scaleRatio, scaleRatio);

        CGContextConcatCTM(context, pdfTransform);
        CGContextDrawPDFPage(context, page);

        UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext();

        CGContextRestoreGState(context);
        UIGraphicsEndPDFContext();
        UIGraphicsEndImageContext();

        return tempImage;
    }
    return nil;
}
Foi útil?

Solução

Acho que resolvi o problema graças às pessoas na lista de discussão dos gráficos da Apple Core. Parece que o CGPDFDocument cache os dados entre as chamadas, mas nunca o libera. Isso parece ser um bug no CoreGraphics. Disseram -me que a única maneira real de isso é carregar e descarregar o PDF toda vez que eu puxo uma página.

Outras dicas

Você provavelmente não estava lançando algo. Tenho que verificar se há coisas como CGPDFPageRetain(<CGPDFPageRef page>) e CGPDFPageRelease(<CGPDFPageRef page>).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top