2009-05-20 7 views

Respuesta

55

Puede llamar la versión directamente en el NSArray. La implementación de NSArray se encargará de enviar release a todos los objetos almacenados en la matriz.

+1

Debería agregar: si tiene un conteo retenido en uno de los objetos contenidos, entonces debe liberar automáticamente * antes de * agregarlo a la matriz. –

+1

Estoy confundido. ¿Por qué debo autorrelease * antes * de agregarlo a una matriz? ¿No puedo, por ejemplo, hacer explícitamente una 'versión' después de agregarla a la matriz? p. [arrayObject addObject: myObject]; [liberación de myObject]; –

+0

@ Heng-Cheong Leong sí, eso también es aceptable. El punto es no arriesgarse a que su objeto sea desasignado antes de que sea retenido por la matriz. –

1

Debería poder lanzar el NSArray y lanzará todos sus objetos, independientemente de si tiene otras referencias a ellos. Si tiene un objeto de instancia que también existe en NSArray, tendrá que liberar ese objeto explícitamente; simplemente liberarlo puede no desasignar el objeto fuera del contexto de la matriz.

+0

dealloc'ing un NSArray * siempre * liberará todos sus objetos, independientemente de otras referencias (que pueden o no causar que sean tratadas inmediatamente dependiendo de otras referencias); Usted está combinando "release" y "dealloc". – smorgan

+0

Gracias - corregido para corregir. – Tim

10

NSArray conserva los objetos cuando se agregan y los libera cuando se eliminan o la matriz se desasigna. Tenga esto en cuenta, es este concepto de "propiedad" el que retiene/libera la gestión de la memoria. Es lo mismo con el objeto que posee la matriz, si también retuvo los objetos en la matriz, tendrá que enviarles otro mensaje de lanzamiento en su implementación dealloc. De lo contrario, y si no hay otros objetos que los retengan, serán desasignados una vez que la matriz los libere.

+0

¡Gracias, su primera frase me salvó el día! –

Cuestiones relacionadas