2011-10-14 28 views
14

Estoy un poco confundido sobre cómo funciona ARC, sé que hay recuento automático de referencias pero funciona esta funcionalidad incluso para asignar variables de instancia sin formato (sin usar las propiedades).iOS 5 variables de instancia

Por ejemplo, si tengo una variable de instancia arr:

@interface TestClass : NSObject { 
    NSArray *arr; 
} 

Ahora bien, si dentro de un método asigno esta usando un auto-lanzado NSArray:

- (IBAction)test { 
    arr = [NSArray arrayWithObject:@"TEST"]; 
} 

¿Qué ocurre con esta matriz? ¿Simplemente lo mantiene mágicamente hasta que arr se reasigne a algo más?

si hago algo como:

self.arr = [NSArray arrayWithObject:@"TEST"]; 

¿Qué pasa si es fuerte frente a débil?

+3

Recomendaría leer el documento Notas de la versión de transición de Apple a ARC. – ditkin

+0

Y para mayor comodidad: http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html –

Respuesta

18

Sí, ARC funciona en el acceso de ivar crudo. Al igual que las variables locales, los ivars son implícitamente __strong a menos que estén decorados con __weak o __unsafe_unretained. Por lo tanto, actuarán de forma predeterminada como una propiedad que se ha marcado strong (o retain, que bajo ARC es un sinónimo de strong).

+0

Kevin, ¿qué ocurre con una propiedad '@ sintetizar'd con semántica' copy' if accede al ivar directamente sintetizado. ¿El compilador inserta una 'copia'? –

+0

@StevenKramer: No. El acceso a ivars directamente * siempre * ignora la semántica de administración de memoria de la propiedad. La única vez que importa es un ivar sintetizado recogerá la semántica débil/fuerte de la propiedad que se está sintetizando) –

+0

Gracias por la información de Kevin. Acabo de verificar esto en el depurador. Una elección un tanto extraña, pero comprensible, supongo. –