2010-04-07 22 views
1

Quelqu'un peut-il me dire ce que je fais mal ici? J'utilise cette méthode pour feuilleter les pages d'un PDF. Mais quelque chose dans le code ne semble pas être publié correctement parce que chaque fois que je tire une page PDF qui contient une image, mon empreinte mémoire augmente. Je suis assez nouveau à CoreGraphics, et ne peux pas pour la vie de moi comprendre où cette méthode fuirait la mémoire.iPhone: CoreGraphics et la gestion de la mémoire

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

Répondre

1

Je pense avoir résolu le problème grâce aux personnes figurant sur la liste de diffusion graphique Apple Core. Il semble que CGPDFDocument met en cache les données entre les appels mais ne les libère jamais. Cela semble être un bug dans CoreGraphics. On m'a dit que le seul moyen de contourner ce problème est de charger et de décharger le PDF chaque fois que je tire une page.

+0

L'avez-vous soumis au radar? – Sneakyness

+0

Merci l'homme. Savons-nous si cela a été corrigé? –

1

Vous ne diffusiez probablement pas quelque chose. Je dois vérifier des choses comme CGPDFPageRetain(<CGPDFPageRef page>) et CGPDFPageRelease(<CGPDFPageRef page>).