Il seguente codice occuperà ~ 410 MB di memoria e non lo rilascerà. (La versione che utilizza dispatch_sync
invece di dispatch_async
richiede una memoria di ~ 8 MB)
Mi aspetto un picco di utilizzo della memoria elevato, ma dovrebbe ridiscendere ... Dov'è la perdita?GCD dispatch_async perdita di memoria?
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSLog(@"test");
});
}
NSLog(@"Waiting.");
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]];
}
return 0;
}
Ho provato:
- Aggiunta @autoreleasepool intorno e all'interno del ciclo
- Aggiunta
NSRunLoop run
all'anello
Ho provato varie combinazioni e mai visto una diminuzione di memoria (anche dopo aver atteso i minuti). Sono consapevole della guida di riferimento GCD che contiene la seguente dichiarazione:
Anche se GCD code di spedizione hanno le loro piscine autorelease, fanno nessuna garanzia in merito a quando le piscine sono drenate.
C'è una perdita di memoria in questo codice? In caso contrario, c'è un modo per far rispettare la coda per rilasciare/svuotare i blocchi finiti?
Questo è vero ma non è una risposta alla domanda. L'utilizzo della memoria dovrebbe ridursi (almeno) dopo che tutti i blocchi sono terminati. Ma non è questo il caso. Un picco di utilizzo della memoria alta andrebbe perfettamente bene. – Andreas
Ho modificato la mia risposta. –