2010-11-02 16 views
5

Cuando necesito una matriz para uso temporal, lo que es la diferencia entre estos:Autorelease frente a liberar

1:

NSMutableArray *stuff = [[NSMutableArray alloc] init]; 
// use the array 
[stuff release]; 

2:

NSMutableArray *stuff = [NSMutableArray array]; 
// use the array 

3:

NSMutableArray *stuff = [[[NSMutableArray alloc] init] autorelease]; 
// use the array 

Prefiero el número 2, ya que es más corto. ¿Hay alguna buena razón para usar el número 1 o 3?

Respuesta

10

El número 2 es probablemente la mejor opción en la mayoría de los casos.

El número 1 tiene la posibilidad de perder el lanzamiento en algún punto de la línea, por la razón que sea, pero libera la matriz inmediatamente, que en entornos con mucha memoria puede ser útil.

El número 3 es básicamente un equivalente detallado del número 2, pero resulta útil si desea utilizar un initWith * que no tiene una matriz correspondienteWith *.

Nota: Si está memoria de hambre, como en un bucle caro donde se necesita una matriz nueva para cada iteración; no suelte y asigne nuevas matrices; solo use -removeAllObjects y recicle la matriz.

+0

Gracias! Buen punto sobre la versión inmediata de la memoria en el número 1. – keronsen

+2

En el iPhone, encontrará que la mayoría de las personas usan el número 1 porque la memoria se devuelve al motor de ejecución más rápido. De hecho, Apple recomienda evitar la liberación automática tanto como sea posible (en el iPhone). – JeremyP

+1

Buena respuesta, guardar para el último bit. Apostaría a que la diferencia entre crear una nueva matriz en cada pasada y eliminar todos los objetos es inconmensurable y, muy probablemente, eliminar todos los objetos será trivialmente más lento. En cualquier caso, no optimice hasta que tenga un problema de rendimiento cuantificado. – bbum

Cuestiones relacionadas