2011-10-20 9 views
56

È a mia conoscenza che l'impostazione di un ivar ora mantiene l'oggetto a cui è assegnata, poiché l'impostazione delle variabili è predefinita per il qualificatore strong. Poiché ivars rientra nell'ambito dell'oggetto in cui sono dichiarati e strong conserva gli oggetti nell'ambito della variabile, ciò significa che il valore di ivars non verrebbe mai rilasciato mentre l'oggetto che contiene ivar è ancora attivo.Proprietà vs ivar in tempi di ARC

È corretto?

Se sì, ho ragione nel pensare che, in termini di gestione della memoria, non c'è più differenza tra una proprietà di conservazione (forte) e un semplice ivar?

+1

Buona domanda, mi stavo chiedendo anch'io ad un certo punto. –

risposta

67

Se una variabile:

  1. viene dichiarato in una classe utilizzando ARC.
  2. Viene utilizzato esclusivamente per l'implementazione di classe (non esposto come parte dell'interfaccia di classe).
  3. Non richiede alcun KVO.
  4. Non richiede alcun getter/setter personalizzato.

Poi occorre dichiarare come un ivar senza un corrispondente @property/@synthesize, e riferirsi ad esso direttamente all'interno attuazione. È in linea con Encapsulation per dichiarare questo ivar nel file di implementazione della classe.

// MyClass.h 
@interface MyClass : ParentClass 
@end 

// MyClass.m 
@implementation MyClass { 
    NSString *myString; 
} 

- (void)myMethod { 
    myString = @"I'm setting my ivar directly"; 
} 
@end 
  • Questa ivar verrà considerato __strong dal compilatore ARC.
  • Sarà inizializzato su nil se è un oggetto o 0 se è un primitivo.
+0

Non si può essere sicuri del 2 articolo. U può accedere a ivar pubblico usando classInstance-> iVar = @ "Nuovo valore" –

+2

@DenisMikhaylov Buon punto. Anche se penso che lascerò il "punto 2" perché sto parlando delle migliori pratiche, e probabilmente non è una buona pratica accedere direttamente agli ivars di una classe. – bearMountain

+0

risposta concisa, grazie. –

6

Non è possibile utilizzare KVO e fare getter e setter personalizzati con variabili di istanza diverso da quello che sono molto simili quando si utilizza ARC.