Aggiornamento: questa perdita è stata risolta. Se si verificano perdite simili e l'applicazione è multi-thread, è molto probabile che si effettuino chiamate UIKit da un thread in background; fai uso di, ad es. [NSThread performSelectorOnMainThread:]
per instradare UIKit chiama al thread principale, che èl'unico posto dove sono consentiti.Le perdite (strumento) segnalano perdite negli oggetti autoreleased
Ho eseguito Leaks sul mio progetto corrente per trovare perdite di recente, e continuo a imbattersi in queste "perdite" che da quello che posso dire non sono realmente fughe di notizie. Il codice seguente, presi direttamente dal progetto, ha due fughe, secondo Perdite:
- (NSArray *)areaForIndex:(int)index
{
NSMutableArray *a = [NSMutableArray arrayWithArray:
[world retrieveNeighborsForIndex:index]]; // leak 1
[a insertObject:[references objectAtIndex:index] atIndex:0];
return [NSArray arrayWithArray:a]; // leak 2
}
Leak 1 va via se cambio la prima riga:
(vedere Update 2-3)
Leak 2 va via se cambio l'ultima riga a:
return a;
non posso, purtroppo, farlo con perdita 1 perché sto gettando una matrice immutabile, in un uno mutevole. Comunque, arrayWithArray dovrebbe automaticamente autorizzarsi, quindi da quello che posso dire, non dovrebbe perdere nulla. Qualche idea per cui questo sta accadendo?
Aggiornamento: l'ho provato sia sul dispositivo che sul simulatore. La perdita è lì su entrambi. Tuttavia, il simulatore ho un po 'ulteriori informazioni su questa perdita:
La storia della fuga di notizie è la seguente:
# | Category | Event Type | Timestamp | RefCt | Address | Size | Responsible Library | Responsible Caller
--+----------+-------------+
0 | CFArray | Malloc | 00:09.598 | 1 | 0x474f6d0 | 48 | asynchro | -[muddyGrid areaForIndex:]
1 | CFArray | Autorelease | 00:09.598 | | 0x474f6d0 | 0 | Foundation | NSRecordAllocationEvent
2 | CFArray | CFRetain | 00:09.598 | 2 | 0x474f7d0 | 0 | Foundation | -[NSCFArray retain]
3 | CFArray | CFRelease | 00:09.611 | 1 | 0x474f7d0 | 0 | Foundation | NSPopAutoreleasePool
Le cose che posso discernere da quanto precede è che la matrice autoreleased è in qualche modo conservavo due volte e poi autoreleased, lasciando mantenere conteggio a 1. Non ho idea di dove o perché se ...
Update 2 & 3: ho provato a cambiare la linea per Leak 1 a:
NSMutableArray *a = [[[NSMutableArray alloc] initWithArray:
[world retrieveNeighborsForIndex:index]] autorelease];
Ho pensato che questo rimosso la perdita, ma non ha, in definitiva. Quindi sono ancora in perdita.
Stai provando sul dispositivo o sul simulatore? – rickharrison
Attualmente solo sul dispositivo. Ma hai ragione, testerò e vedrò come si presenta al Simulatore e si aggiorna. – Kalle
Aggiornato la descrizione sopra per includere ciò che ho capito provandolo sul simulatore. Grazie per il puntatore! :) – Kalle