Sono nuovo al codice gestito in memoria ma ottengo l'idea abbastanza bene.Rilascio obiettivo, autorelease e tipi di dati
Accedendo alla mia app attraverso lo strumento di perdite in XCode, ho notato che dovevo solo pulire i miei oggetti personalizzati, ma non gli array creati dinamicamente, ad esempio, quindi ho pensato che quei tipi di dati sono autorelocati - ha senso dal momento che avevo solo per rilasciare gli array che ho usato come proprietà che avevano (conservarli) su di essi.
Poi ho notato qualcosa di strano: mi è stato sempre una perdita su una certa gamma inizializzato in questo modo:
NSMutableArray *removals = [NSMutableArray new];
ma non uno simile
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
Ora, la ragione per uno è stato istituito con "new" è che potrebbe contenere da 0 a 99 elementi, mentre l'altro che conoscevo sarebbe stato sempre 9. Dato che entrambi gli array passano allo stesso metodo in seguito in base all'interazione dell'utente, stavo ottenendo una perdita se non ho rilasciato alla fine del metodo, o un'eccezione se l'avessi fatto!
ho cambiato il primo array di
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
e ottengo perdite e non hanno nulla a rilasciare. Qualcuno può spiegare?
** Tutti ** di questi metodi restituiscono un oggetto con un conteggio di ritenzione di 1. La differenza è solo quella con alcuni dei proprietari dell'oggetto e quindi è necessario rilasciarlo e con gli altri non si possiede il oggetto e non sono obbligati a rilasciarlo (ma non può contare sul fatto che si trovi oltre la catena di chiamate corrente). – Chuck
Strettamente parlando, no, non è un dettaglio di implementazione. In un certo numero di casi restituiscono le cose con diversi conti di mantenimento. Ad esempio = [UIImage imageNamed:] potrebbe restituire qualcosa con un retainCount di grandi dimensioni molto grande perché potrebbe riutilizzare un'immagine memorizzata nella cache. –
Beh, sì, il conteggio dei ritiri è di per sé un dettaglio di implementazione. I documenti di Apple dicono altrettanto. E in tutti i casi elencati sopra, sulle attuali versioni di OS X, il valore di questo dettaglio di implementazione è 1. – Chuck