iPhone: CoreGraphics и управление памятью - PullRequest
1 голос
/ 07 апреля 2010

Может кто-нибудь сказать мне, что я здесь делаю не так? Я использую этот метод для пролистывания страниц в PDF. Но что-то в коде, кажется, не высвобождается должным образом, потому что каждый раз, когда я перетаскиваю страницу PDF, содержащую изображение, мой объем памяти увеличивается. Я довольно новичок в CoreGraphics и не могу понять, где этот метод будет пропускать память.

-(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;
}

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Вы, вероятно, не выпускали что-то. Должен проверить вещи вроде CGPDFPageRetain(<CGPDFPageRef page>) и CGPDFPageRelease(<CGPDFPageRef page>).

1 голос
/ 08 апреля 2010

Я думаю, что решил проблему благодаря людям из списка рассылки по графическому ядру Apple. Кажется, что CGPDFDocument кэширует данные между вызовами, но никогда не освобождает их. Это похоже на ошибку в CoreGraphics. Мне сказали, что единственный реальный способ обойти это загрузить и выгрузить PDF каждый раз, когда я перетаскиваю страницу

...