Ho questo problema. Ho un database di immagini in Core Data. Prendo tutte le immagini (circa 80 MB) e inserisco un NSMutableArray. Gli oggetti vengono correttamente ineccepibili:Memoria dati di utilizzo e memoria Attenzione
NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];
self.cache = [NSMutableArray arrayWithArray:fetchResults];
for (ImageCache *imageObject in self.cache) {
NSLog(@"Is fault? %i", [imageObject isFault]);
}
Leggendo il registro, vedo che gli oggetti sono tutti correttamente ineccepibili Tuttavia, l'utilizzo di strumenti, vedo che 80 MB di memoria vengono utilizzati. Penso che questo sia il motivo per cui Core Data memorizza nella cache i suoi risultati e dovrebbe liberare la memoria quando è necessaria. Ma (e questo è il mio "problema"), se simulo un avviso di memoria, non succede niente! Gli 80 MB rimangono lì.
Guardando strumenti - allocazioni, il 80 MB sono utilizzati da molti Malloc: (esempio)
Grafico Categoria vivo Bytes # Living # transitorie In generale Byte # # Nel complesso Accantonamenti (netto/totale) 0 Malloc 176,00 KB 8,59 MB 50 57 18,39 MB 107% 0,00,% 0,00 0 Malloc 200,00 KB 8,20 MB 42 460 98,05 MB 502% 0,00,% 0,04 0 Malloc 168,00 KB 7,05 MB 43 19 10,17 MB 62% 0.00, 0.00%
Questo è un link ad un'immagine di tutta la chiamata Tree: https://www.dropbox.com/s/du1b5a5wooif4w7/Call%20Tree.png
Qualche idea? Grazie
Forse i dati di base liberano memoria su 'Memory Warning Level 2'? È possibile produrre un arresto anomalo della memoria con il tuo scenario? – brigadir
Esiste un "metodo magico" per simulare un livello di avviso di memoria 2? O "semplicemente" devo consumare la memoria? – LombaX
Non conosco alcun metodo di simulazione. Dovresti eseguire un'altra app "pesante" (ad esempio Appstore), mantenendo l'app in log della console di background e di tracciamento e nella scheda di memoria degli strumenti. L'avviso di 'livello 2' sarà menzionato in console - quindi dovresti guardare il grafico della memoria in quel momento. – brigadir