CGContextDrawPDFPage ocupando grandes cantidades de memoria

Tengo un archivo PDF que quiero dibujar en forma de resumen. Quiero dibujar las primeras páginas del documento, cada una en su propio UIImage, para usar en un botón, de modo que cuando se haga clic, la pantalla principal vaya a la página en la que se hace clic.

Sin embargo, CGContextDrawPDFPage parece estar usando cantidades copiosas de memoria cuando intenta dibujar la página. Aunque se supone que la imagen solo tiene una altura de 100 px, la aplicación falla al dibujar una página en particular, que de acuerdo con Instruments, asigna aproximadamente 13 MB de memoria solo para una página.

Aquí está el código para dibujar:

//Note: This is always called in a background thread, but the autorelease pool is setup elsewhere + (void) drawPage:(CGPDFPageRef)m_page inRect:(CGRect)rect inContext:(CGContextRef) g { CGPDFBox box = kCGPDFMediaBox; CGAffineTransform t = CGPDFPageGetDrawingTransform(m_page, box, rect, 0,YES); CGRect pageRect = CGPDFPageGetBoxRect(m_page, box); //Start the drawing CGContextSaveGState(g); //Clip to our bounding box CGContextClipToRect(g, pageRect); //Now we have to flip the origin to top-left instead of bottom left //First: flip y-axix CGContextScaleCTM(g, 1, -1); //Second: move origin CGContextTranslateCTM(g, 0, -rect.size.height); //Now apply the transform to draw the page within the rect CGContextConcatCTM(g, t); //Finally, draw the page //The important bit. Commenting out the following line "fixes" the crashing issue. CGContextDrawPDFPage(g, m_page); CGContextRestoreGState(g); } 

¿Hay una mejor manera de dibujar esta imagen que no ocupe grandes cantidades de memoria?

Intenta agregar:

 CGContextSetInterpolationQuality(g, kCGInterpolationHigh); CGContextSetRenderingIntent(g, kCGRenderingIntentDefault); 

antes de :

 CGContextDrawPDFPage(g, m_page); 

Tuve un problema similar y al agregar la llamada a la función 2 anterior obtuve el renderizado usando 5x menos memoria. Podría ser un error en las funciones de dibujo de CGContextXXX

Eche un vistazo a mi código para una cortadora de imágenes PDF en github:

http://github.com/luciuskwok/Maps-Slicer

Debe haber suficiente memoria en el dispositivo que una asignación de 13 MB no va a matar a la aplicación. ¿Está agotando el grupo de autorrelease cada vez que renderiza un PDF? También es posible que desee almacenar en caché el procesamiento en un UIImage para que no tenga que renderizarlo cada vez que se muestre.