2012-01-17 12 views
5

Digamos que tengo una fuerte propiedad de esta manera:¿Es seguro asignar una propiedad al resultado de un inicializador liberado automáticamente mientras se usa ARC?

@interface Foo 
    @property (strong, nonatomic) NSArray *myArray; 
    @end 

Y, en mi inicializador, me puse miMatriz así:

myArray = [NSArray array]; 

Es esto seguro? ¿ARC se ocupará de retener adecuadamente myArray para mí?

La razón por la que pregunto es que tengo un proyecto donde myArray no está correctamente conservado en este escenario, y me sale un mal acceso a la memoria en el camino.

Pero, si uso

myArray = [[NSArray alloc] init]; 

entonces todo está bien.

+0

Por "en mi inicializador" te refieres al método 'init [With ...]' de tu clase, ¿correcto? –

+1

No está usando la propiedad en su asignación, está asignando directamente el respaldo ivar (lo cual es correcto en un inicializador). Pero no debería importar, ARC retendrá esta matriz de cualquier manera. (Dado que el ivar de respaldo debe ser también __strong) –

Respuesta

7

Sí, ARC lo retendrá automáticamente.

La manera de pensar en ARC es esta: si tiene un puntero fuerte a un objeto, entonces se garantiza que permanecerá vivo. Cuando todos los punteros (bueno, todos los punteros fuertes punteros) a un objeto desaparecen, el objeto morirá.

Desde la descripción de su problema, parece que ARC no está habilitado correctamente en el archivo donde está ejecutando ese código. De todos modos, te recomendaría ejecutar tu aplicación con Instruments, usando la plantilla "Zombies". Eso le permitirá ver el historial completo de retención/liberación de ese objeto, y usted debería ser capaz de descubrir dónde van las cosas mal.

+0

Definitivamente lo tengo habilitado. Quizás hay algo más que me falta en mi clase ... – jimothy

+0

Actualicé mi respuesta para hablar sobre la plantilla "Zombies" en Instruments; ahí es donde iría después. –

Cuestiones relacionadas