CGContextDrawPDFPage ocupando grandes quantidades de memory

Eu tenho um arquivo PDF que eu quero desenhar em forma de esboço. Eu quero desenhar as primeiras páginas no documento, cada uma em sua própria UIImage para usar em um botão para que, quando clicado, a canvas principal navegue para a página clicada.

No entanto, CGContextDrawPDFPage parece estar usando quantidades copiosas de memory ao tentar desenhar a página. Mesmo que a imagem deva ter apenas 100px de altura, o aplicativo trava ao desenhar uma página em particular, o que, de acordo com o Instruments, aloca cerca de 13 MB de memory apenas para uma página.

Aqui está o código para desenhar:

//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); } 

Existe uma maneira melhor de desenhar essa imagem que não ocupa grandes quantidades de memory?

Tente adicionar:

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

antes :

 CGContextDrawPDFPage(g, m_page); 

Eu tive um problema semelhante e adicionando a chamada de function 2 acima resultou na renderização usando 5x menos memory. Pode ser um bug nas funções de desenho do CGContextXXX

Dê uma olhada no meu código para um slicer de imagens em PDF no github:

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

Deve haver memory suficiente no dispositivo que uma alocação de 13 MB não vai matar o aplicativo. Você está drenando o pool de autorelease toda vez que renderiza um PDF? Você também pode querer armazenar em cache a renderização em um UIImage para que ele não precise renderizá-lo toda vez que for exibido.