2012-02-05 10 views
6

Ho una domanda sull'utilizzo di getter e variabili di istanza. Vediamo un esempio.iOS quando uso variabile di istanza o metodo getter

Supponiamo che io sono in un file .h:

@property (nonatomic,strong) NSString *name 

e nel file .m i sintetizzare quella variabile in questo modo:

@synthesize name = _name; 

Ora la mia domanda è: qual è la differenza tra utilizzare:

[self.name aMethod] 

e

[_name aMethod] 

Grazie!

risposta

8

Il primo accede a Ivar tramite il metodo getter. Il secondo accede direttamente all'avorio. Poiché si tratta di una proprietà semplice e sintetizzata, non c'è molta differenza se non che il primo effettua una chiamata di metodo aggiuntiva. Tuttavia, se la proprietà fosse atomica, o dinamica, o il metodo getter fosse complicato, ci sarebbe una differenza nel fatto che il primo sarebbe effettivamente atomico mentre il secondo non lo farebbe e il primo effettivamente innescherebbe una logica complicata nel getter mentre il secondo no.

In termini più semplici, il compilatore riscrive la prima chiamata a:

[[self name] aMethod] 

mentre la seconda chiamata viene semplicemente lasciato così com'è.

1
[self.name aMethod] 

è equivalente a

[[self name] aMethod] 

Così un getter viene chiamato e il messaggio viene inviato al suo risultato.

Nel tuo caso, il risultato visibile sarà lo stesso.

Tuttavia, potrebbe non essere un caso se getter non fosse banale (cioè sintetizzato).

0

Le prime chiamate attraverso il getter - è uguale a [[self name] aMethod]. Il secondo usa solo l'accesso diretto.

Generalmente si dovrebbe preferire l'utilizzo degli accessor, ma ci sono dei momenti in cui dovresti deviare da quello. l'evento più comune si verifica in stati parzialmente costruiti, ad esempio l'inizializzatore e dealloc. la ragione è che dovresti costruire attentamente o distruggere il tuo stato, e non interessarti alla semantica dell'interfaccia dell'oggetto - cioè, usare gli accessor può avere effetti collaterali negativi e comportamentali.

un elenco più completo dei motivi può essere trovato qui: Why would you use an ivar?

Problemi correlati