2012-09-19 18 views
23

Sto cercando di trovare un'altra perdita di memoria nel mio codice e non riesco a capire cosa sia CG Raster Data. Mentre si passa attraverso il VM Tracker con le istantanee automatiche abilitate, il CG Raster Data sembra essere l'unica parte che aumenta. Anche questi aumentano costantemente senza aumentare le allocazioni.Che cos'è CG Raster Data?

Non sono del tutto sicuro di cosa sia il CG Raster Data, né come lo risolverei, ma a questo punto l'ingombro aumenta alla fine causa un errore di memoria e si blocca, quindi non va bene! Realizzo il mio rendering di testo (usando CoreText), quindi penso che abbia qualcosa a che fare con questo. Sto anche caricando le foto?

seguito è l'immagine dell'impronta: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

UPDATE: "NSConcreteGlyphGenerator" Questo problema persiste, ma abbastanza interessante posso correlare ad una perdita entro UIFoundations a qualcosa che si chiama Sembra che si verifichi solo quando chiamo un metodo "boundingRectWithSize:" su una stringa attribuita nel metodo CoreText che effettivamente disegna. La linea, in particolare, è:

[displayString boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:0 context:nil]; 

Lentamente il monitoraggio in giù ...

+4

Hai mai immaginato questo è fuori? Sto avendo questo problema ancora in iOS 7. – Daniel

+0

Qualsiasi aggiornamento su questo? @Daniel –

risposta

1

Questo non è molto più di una risposta, ma solo così qualcuno ottiene l'indagine è iniziata ...

penso CG Raster Data è nuovo con iOS 6, ma era presente in iOS 5 come CG Image. Ho provato su entrambi i simulatori e su iOS 5, CG Raster Data non era presente, ma se si confrontano gli importi totali su iOS 6 e iOS 5, CG Image è quasi uguale a CG Raster Data, e CG Image non mostra su iOS 6. Quindi sono abbastanza sicuro che abbiano appena cambiato il nome di CG Image in CG Raster Data.

Per quanto riguarda l'immagine CG, ho cercato di capirlo per mesi. Penso che sia solo il layout di visualizzazione relativo alle cose gestite dal sistema, che non controlli realmente, perché la mia app non ha davvero immagini UIImages o CG, e la mia memoria immagine CG è piuttosto alta, quindi probabilmente è qualcosa da fare con Core Animation e vista layout.

+0

"Immagine CG" è ancora presente è iOS 6, almeno nella mia app. –

+0

Ya, anche per me, anche se estremamente piccole tracce di it..whereas in iOS 5 è di circa 20 MB, in iOS 6 il suo 32 kb max. Quindi, qualunque sia l'immagine di CG, non ha un ruolo così importante in iOS 6 – Snowman

12

Non so tutto ciò che "dati raster CG" potrebbero contenere, ma una cosa che so per certo che contiene è ... memoria allocata da Core Graphics per memorizzare dati raster, ovvero bitmap.

In particolare, nella mia app, creo due contesti bitmap 256x256 utilizzando CGBitmapContextCreate. Passo NULL come parametro data, in modo che Core Graphics assegni la memoria bitmap per me. Una bitmap 256x256 con 32 bit (4 byte) per pixel richiede 256 KiB = 64 pagine di 4 KiB ciascuna. In Strumenti, ottengo due blocchi "dati raster CG" di 65 pagine ciascuno. Se commento uno di questi contesti bitmap, ottengo solo un blocco "Dati raster CG" di 65 pagine in Strumenti.

D'altra parte, ho anche un CATiledLayer nella mia app. Il CATiledLayer imposta i propri contesti grafici per me da disegnare, e credo crei quei contesti usando la memoria condivisa che anche il server della finestra (springboard su iOS 5, backboard su iOS 6) accede direttamente. Non vedo alcun blocco "CG raster data" corrispondente a quei contesti grafici.

0

Se si è preoccupati per l'utilizzo della memoria (89 MB) è un po '. Hai provato a simulare un avviso di memoria nel simulatore (Simulatore> Hardware> Simula memoria avviso)?

La mia ipotesi è che la memoria sia esaurita dalle immagini.

È probabile che si potrebbe essere necessario rilasciare le immagini osservando il messaggio di avviso di memoria:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

Cancella tutti gli oggetti di immagine in handleMemoryWarning metodo.

+0

come cancellare tutte le immagini? significa 'image = nil'? o 'self.view = nil'? – aircraft

2

Ho avuto lo stesso problema con la memoria CG dati raster aumentando semplicemente spingendo e schioccare una controller della vista più volte. Ho passato un po 'di tempo a pensare che fosse un problema con qualche codice di disegno. Alla fine l'ho rintracciato a un delegato che non si riferiva debolmente al controller della vista che veniva spinto e fatto scoppiare, quindi quando ho fatto scoppiare il controller della vista, non era stato rilasciato. Il CG dati raster capitato di essere la parte più grande di orma che di controller della vista, così ho erroneamente attribuito il problema che inizialmente, quando era davvero il controller della vista in sé che non era stato rilasciato (quindi, non rilasciando la sua vista, alcune delle che aveva CG Raster Data).

In breve: se stai vedendo le perdite di memoria con CG dati raster, guarda controller di vista che potrebbero avere opinioni con loro, e assicurarsi che essi vengono rilasciati.

0
Non

davvero una risposta. Ma alcuni ulteriori suggerimenti che ho capito mentre risolvere il mio CG-raster-dati-perdite:

  • il CG-raster-dati contiene la memoria di CGIMageRefs (almeno creati da CGBitmapContextCreateImage() da un contesto creato da CGBitmapContextCreate (NULL, ...)
  • mia perdita era la mancanza di un CGImageRelease(). ho usato l'immagine di passare come contenuto di un CALayer e presume che questa proprietà contiene il riferimento. Ma sembra che questa assegnazione copia l'immagine. a Almeno non ho problemi a chiamare CGImageRelease subito dopo l'assegnazione

Speranza che aiuti qualcuno ...

1

Quando ho avuto un problema con questo, il "CG Raster Data" proveniva da un'immagine che ho creato da una chiamata a UIGraphicsGetImageFromCurrentImageContext da all'interno di UIGraphicsBeginImageContextWithOptions. Mi ci è voluto un giorno per rintracciare il problema, e alla fine non era legato a come l'immagine fosse stata creata. Nel mio caso ho bloccato inavvertitamente l'immagine in un NSCache del mio in un'altra parte del codice, senza rendermene conto.

Se si riscontrano problemi con CG Raster Data che non viene rilasciato, è necessario considerare che l'origine di dove sono stati creati i dati potrebbe non avere nulla a che fare con il problema reale. Potrebbe essere che i dati dell'immagine vengano semplicemente mantenuti quando non ci si aspetta che siano, e l'etichetta "CG Raster Data" che si vede in Strumenti si riferisce solo a dove sono originati i dati. Dovresti controllare di non fare qualcosa come multiple addSubviews senza aver rimosso removeFromSuperview (con UIImageViews per esempio), o mettere l'immagine in una cache, un array, una variabile forte, ecc.

+0

Mi sembra di avere un problema molto simile. Puoi approfondire il problema con l'inserimento di un'immagine in un NSCache? – Kenneth

Problemi correlati