2011-10-14 1 views
14

Sono leggermente confuso su come funziona ARC, so che esiste il conteggio dei riferimenti automatico ma questa funzionalità funziona anche per assegnare le variabili di istanza non elaborate (non utilizzando le proprietà).Variabili di istanza di iOS 5

Ad esempio, se ho una variabile istanza arr:

@interface TestClass : NSObject { 
    NSArray *arr; 
} 

Ora, se all'interno di un metodo assegno questo utilizzando un autocampionatore rilasciato NSArray:

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

Cosa accade a questo array? Lo tiene semplicemente magicamente fino a quando lo arr viene riassegnato a qualcos'altro?

Ora, se faccio qualcosa di simile:

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

Che cosa succede se è forte contro debole?

+3

Si consiglia di leggere il documento Transizione in ARC Release Notes di Apple. – ditkin

+0

E per comodità: http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html –

risposta

18

Sì, ARC funziona su accesso raw ivar. Proprio come le variabili locali, ivar sono implicitamente __strong se non decorate con __weak o __unsafe_unretained. Pertanto, per impostazione predefinita, si comportano come una proprietà che è stata contrassegnata con strong (o retain, che sotto ARC è un sinonimo di strong).

+0

Kevin, cosa succede con una proprietà '@ synthesize'd con la semantica' copia' se accedi direttamente all'arabo sintetizzato. Il compilatore inserisce una 'copia'? –

+0

@StevenKramer: No. Accedere direttamente a ivars * sempre * ignora la semantica di gestione della memoria della proprietà. L'unica volta che conta è che un ivar sintetizzato riprenda la debole/forte semantica della proprietà da cui viene sintetizzato) –

+0

Grazie per le informazioni Kevin. Ho appena verificato questo nel debugger. Una scelta un po 'strana, ma comprensibile, credo. –