2011-08-26 16 views
7

Sotto la gestione manuale della memoria standard di Objective-C, è stato suggerito nel this question che il modo di rilasciare un NSArray inizializzata conSotto ARC, come posso rilasciare gli elementi in un NSArray?

imageArray = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"], 
         [UIImage imageNamed:@"2.png"], 
         nil]; 

è stato quello di utilizzare

[imageArray release]; 
imageArray = nil; 

Dato che non siamo più in grado di utilizzare -release sotto conteggio automatico dei riferimenti, quale sarebbe il modo consigliato di rilasciare questo NSArray sotto ARC?

+0

Si prega di fornire alla vostra domanda alcuni contenuti effettivi invece di limitarsi a collegarsi a un altro e di chiedere "come fare usando ARC" – BoltClock

+2

Sotto ARC, non potete semplicemente impostare imageArray = nil; e l'analizzatore statico deciderà se posizionare un rilascio? – matthias

+0

possibile duplicato di [matrice di immagini chiare sul clic del pulsante] (http://stackoverflow.com/questions/3178039/clear-image-array-on-button-click) – Caleb

risposta

12

Se imageArray è un ivar per un oggetto (forse non un presupposto sicuro), è necessario utilizzare un accessorio per impostare la matrice su zero; la funzione di accesso si prenderà cura di liberare la matrice e tutti i suoi membri:

[self setImageArray:nil];

Se è necessario pulire un array con molti membri, ma mantenere una matrice valida pronto in quel Ivar in modo che altri metodi può tranquillamente inviare messaggi, è possibile utilizzare il seguente:

[self setImageArray:[[NSArray alloc] init]];

che andrà a sostituire la vecchia gamma con una nuova, array vuoto.

+1

È un po 'fuorviante dire che stai mantenendo la matrice. Non lo stai mantenendo, lo stai sostituendo con un nuovo array vuoto. – Caleb

+0

Vero; Modificherò la mia risposta di conseguenza. – matthias

+1

"Se imageArray è un ivar per un oggetto (forse non un presupposto sicuro), è necessario utilizzare un accessor per impostare la matrice su zero, l'accessor si occuperà di rilasciare l'array e tutti i relativi membri" An ivar isn " lo stesso di una proprietà. Ogni proprietà utilizza una variabile di istanza, ma non tutte le variabili di istanza utilizzano una proprietà. Inoltre, sotto ARC, non hai bisogno di proprietà per ottenere il rilascio automatico. Basta impostare ivar su 'nil' (quindi:' imageArray = nil') e il compilatore farà il lavoro. ;-) –

19

Per utilizzare ARC è sufficiente rimuovere i tuoi messaggi retain e release e il gioco è fatto. Quindi, a sbarazzarsi del vostro array come questo:

imageArray = nil; 

Questo funziona e non perde perché sotto ARC il compilatore inserisce automaticamente i necessari retain e release chiamate.

Problemi correlati