2010-03-12 12 views
7

Tengo una pregunta de novato sobre cuándo liberar los elementos de un NSArray. Ver pseudo código siguiente:Objective C Matriz y objeto Release

NSMutalbeArray *2DArray = [[NSMutableArray alloc] initWithCapacity:10]; 
for (int i=0;i<10;i++) { 
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5]; 
    for (int j=0;j<5;j++) { 
    MyObject *obj = [[MyObject alloc] init]; 
    [array addObject:obj]; 
    [obj release]; 
    } 

    [2DArray addObject:array]; 
    [array release]; 
} 
// use 2DArray to do something 

[2DArray release] 

Mi pregunta aquí es, cuando suelto 2DArray, ¿necesito para liberar explícitamente cada uno de sus elementos (matriz) en primer lugar? Además, antes de liberar el objeto "array", ¿necesito liberar cada uno de sus elementos (MyObject) primero?

Soy nuevo en Objective C. Ayuda. Gracias.

Respuesta

14

No, no necesita decirle a cada objeto que sea release d. Cuando envía un método release a un NSArray, automáticamente envía un método release a cada elemento dentro primero.

En su caso, envíe [2DArray release]. Esto envía automáticamente [array release] a cada otra matriz, que envía [obj release] a cada objeto dentro de cada array.

4

No es necesario que suelte los objetos guardados. NSArray los conserva cuando los agrega y los libera cuando se los libera. Entonces, si asigna, agrega a la matriz, luego suelta, el objeto en la matriz tendrá el conteo de retención de 1. Una vez que se libera la matriz, el objeto se libera, por lo tanto se libera.

2

Cuando se crea un objeto, tiene un conteo de retención de 1. Cuando se agrega un objeto a una matriz, su conteo de retención aumenta (en este caso a 2). Después de agregar a la matriz, su código libera su retención del objeto, dejando caer su conteo de retención en 1 (a 1 en este caso). Luego, cuando sueltas la matriz, se libera todo lo que contiene, lo que reduce sus recuentos de retención en 1 (hasta 0 en este caso). Cuando el conteo de retención llega a 0, el objeto se desasigna.

Su código se ve correcto desde un punto de soporte de gestión de memoria.