2011-08-26 25 views
7

Bajo la gestión de memoria manual de Objective-C estándar, se sugirió en this question que la manera de liberar una NSArray inicializar utilizandoEn ARC, ¿cómo puedo liberar los elementos en un NSArray?

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

era utilizar

[imageArray release]; 
imageArray = nil; 

Teniendo en cuenta que ya no podemos utilizar -release bajo el recuento automático de referencias, ¿cuál sería la forma sugerida de liberar este NSArray bajo ARC?

+0

Responda a su pregunta sobre el contenido real en lugar de simplemente vincularlo con otro y preguntarle "cómo hacerlo usando ARC" – BoltClock

+2

En ARC, no puede simplemente configurar imageArray = nil; y el analizador estático decidirá si colocar un lanzamiento? – matthias

+0

posible duplicado de [matriz de imagen clara al hacer clic en el botón] (http://stackoverflow.com/questions/3178039/clear-image-array-on-button-click) – Caleb

Respuesta

12

Si imageArray es un ivar para un objeto (quizás no es una suposición segura), debe usar un acceso para establecer la matriz en nil; el descriptor de acceso se hará cargo de la liberación de la matriz y de todos sus miembros:

[self setImageArray:nil];

Si necesita limpiar una matriz con muchos miembros, pero mantener una matriz válida lista en que Ivar haciendo que otros métodos puede de manera segura enviar mensajes, puede utilizar lo siguiente:

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

que sustituirá a la antigua matriz con una nueva matriz vacía.

+1

Es un poco engañoso decir que estás manteniendo la matriz. No lo estás guardando, lo estás reemplazando con una matriz nueva y vacía. – Caleb

+0

Verdadero; Voy a editar mi respuesta en consecuencia. – matthias

+1

"Si el imageArray es un ivar para un objeto (tal vez no es una suposición segura), debe usar un acceso para establecer el conjunto en nil; el acceso se encargará de liberar el conjunto y todos sus miembros" An ivar isn ' t lo mismo que una propiedad. Cada propiedad usa una variable de instancia, pero no todas las variables de instancia usan una propiedad. Además, bajo ARC, no necesita propiedades para obtener la liberación automática. Simplemente configure el ivar a 'nil' (así:' imageArray = nil') y el compilador hará el trabajo. ;-) –

19

Para usar ARC simplemente elimine sus mensajes retain y release y ya está. Por lo que deshacerse de su arsenal como esto:

imageArray = nil; 

Esto funciona y no se escapa porque bajo ARC el compilador inserta automáticamente las necesarias retain y release llamadas.

Cuestiones relacionadas