CGContextDrawPDFPage occupa grandi quantità di memoria

Ho un file PDF che voglio disegnare in forma di contorno. Voglio disegnare le prime diverse pagine del documento ciascuna nella propria UIIimmagine da utilizzare su un pulsante in modo che quando si fa clic, il display principale si sposti alla pagina cliccata.

Tuttavia, CGContextDrawPDFPage sembra utilizzare quantità copiose di memoria quando si tenta di disegnare la pagina. Anche se l’immagine dovrebbe essere alta circa 100px, l’applicazione si blocca mentre si disegna una pagina in particolare, che in base a Instruments, alloca circa 13 MB di memoria solo per una pagina.

Ecco il codice per disegnare:

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

C’è un modo migliore per disegnare questa immagine che non occupa grandi quantità di memoria?

    Prova ad aggiungere:

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

    prima :

     CGContextDrawPDFPage(g, m_page); 

    Ho avuto un problema simile e l’aggiunta della chiamata a 2 funzioni sopra ha comportato il rendering utilizzando 5 volte meno memoria. Potrebbe essere un bug nelle funzioni di disegno CGContextXXX

    Dai un’occhiata al mio codice per un’affettatrice di immagini PDF su github:

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

    Ci dovrebbe essere abbastanza memoria sul dispositivo che un’assegnazione di 13 MB non ha intenzione di uccidere l’app. Stai scaricando il pool di autorelease ogni volta che esegui il rendering di un PDF? Si potrebbe anche voler memorizzare il rendering in una UIImage in modo che non debba renderlo ogni volta che viene visualizzato.