2011-10-30 16 views
7

ho visto un esempio in un libro che mostra questo codice:dichiarazione di variabili nelle @implementation

@implementation ViewController 
{ 
    NSString *name; 
} 

Perché non dichiarare questo @interface? Qual è la differenza nel dichiarare le variabili in @implementation anziché @interface? Perché dichiarare questo NSString in un ambito?

risposta

8

Il vantaggio di dichiarare ivars nella sezione @implementation è l'incapsulamento migliore. In questo modo, ivar non deve apparire nel file .h e quindi non è visibile agli utenti esterni della classe che riescono a vedere solo il file di intestazione. Questo nasconde meglio l'implementazione interna della classe.

In generale, ora che le proprietà possono avere ivars auto-sintetizzato e altri Ivars possono essere dichiarate direttamente nel blocco @implementation, non vedo alcuna ragione per cui si dovrebbe dichiarare un Ivars a tutti nella vostra @interface (a parte la compatibilità all'indietro).

Perché dichiarare questo NSString in un ambito?

Perché questo è l'unico modo per dichiarare una variabile di istanza. Altrimenti dichiareresti una variabile a cui si potrebbe accedere da qualsiasi punto dello stesso file (vedi la domanda BoltClock collegata al suo commento).

+0

Quindi, se dichiaro che NSString non rientra nell'ambito, diventerebbe una variabile globale? Voglio dire che qualsiasi classe esterna potrebbe accedere alla variabile? –

+4

Sort of; vedi la domanda che alcuni pensavano fosse un complice poiché copre la differenza tra ivar e globali/statici. Nota che le dichiarazioni di ivar in '@ implementation' sono relativamente nuove - non è stato possibile nel runtime di Mac OS X a 32 bit a causa del modo in cui il compilatore ha generato le classi. Una volta risolto il problema della "fragile classe di base", è stato possibile eseguire l'auto-sintesi e/o dichiarare ivars al di fuori dell'interfaccia '@ primaria '. – bbum

Problemi correlati