2009-07-08 11 views
8

La differenza tra una proprietà e una variabile di istanza in Objective-C. Ho bisogno di capire questo in termini OOP. Una dichiarazione di proprietà è solo un comodo wrapper (con @synthesize nell'implementazione) per accedere alle variabili di istanza?Proprietà Objective-C nello sviluppo di iPhone

grazie,

codecowboy.

risposta

7

Proprietà e Ivars sono due cose completamente diverse.

E la variabile di istanza è una variabile memorizzata all'interno dell'oggetto, quindi ogni istanza ha il suo. Si fa riferimento all'aggiunta del puntatore relativa al puntatore/auto dell'oggetto (leggermente indiretta per il runtime moderno, ma funzionalmente equivalente). ivars sono generalmente interni a una classe e, per impostazione predefinita, sono accessibili solo dalla classe e dai suoi discendenti (@protected). All'interno dei metodi sono disponibili senza qualifica, altrimenti possono (ma raramente, ad esempio, non dovrebbero) essere accessibili tramite indirezione, ad esempio obj-> ivar.

Una proprietà definisce un'interfaccia getter and setter (il setter è facoltativo). Questo è tutto ciò che fa. Definisce due metodi pubblici:

- (TYPE) propname; 
- (void) setPropname: (TYPE) newPropname; 

Questi sono definiti come metodi esattamente come se li avessi dichiarati in quel modo, né più né meno. Questi metodi sono chiamati con la sintassi normale ([obj propname] e [obj setPropname: n] o usando la moderna notazione dei punti (obj.propname o obj.propname = n). Queste due opzioni sono solo sintatticamente diverse, si comportano in modo identico ed è possibile utilizzare la notazione punto se i metodi sono dichiarati con @property o dichiarati manualmente come sopra.

È necessario quindi implementare i metodi nell'implementazione, scrivendo i metodi manualmente, utilizzando @synthesize o gestendo il metodo mancante dinamicamente

Le proprietà possono essere supportate da un ivar (con lo stesso nome o lo stesso nome (la mia preferenza è evitare confusione)) oppure potrebbero non memorizzarlo altrove, oppure possono calcolarlo da altri dati

Ad esempio, si potrebbe avere:

@property (nonatomic, readonly) NSString* fullname; 

e quindi implementare - (NSString *) fullname per restituire la concatenazione di nome e cognome.

+0

Questo è esattamente il punto della mia confusione. Un'istanza dell'oggetto non possiede anche le sue proprietà? La mia comprensione degli oggetti in termini generali è che contengono informazioni sullo stato (dati) e sul comportamento (metodi). Perché ho bisogno di variabili d'istanza e proprietà? Le variabili di istanza sono immutabili a meno che non le dichiaro come proprietà? – codecowboy

+2

Una proprietà è un'interfaccia per oggetti esterni per ottenere e impostare i dati. Una variabile di istanza è interna a quell'oggetto, sebbene possa essere esposta a oggetti esterni utilizzando le proprietà, i propri metodi getter/setter o indirettamente tramite altri metodi pubblici creati dall'utente. –

+1

In altre parole, l'istruzione di proprietà non crea qualcosa nell'oggetto istanza. Dice solo al mondo esterno come ottenere qualcosa dall'oggetto. Che qualcosa potrebbe essere una variabile di istanza, o se potrebbe essere una qualsiasi informazione per cui si desidera scrivere il metodo getter e setter. Come per le variabili di esempio, è possibile accedervi come in C e C++. – Vagrant

4

Penso che tu sia più o meno lì. Le proprietà @property e @synthesize rendono le dichiarazioni accessorie e l'implementazione per l'ivar già dichiarato. Hai diversi attributi è possibile definire il @property anche dando il controllo su come viene generato per renderlo appropriato per l'Ivar

dare un'occhiata a "Objective C 2.0 Declared Properties"

0

La differenza tra proprietà e grado Ivar è, la variabile che rendono come Proprietà che può essere visibile in un'altra classe, mentre per l'accesso al iVar o l'istanza è necessario creare la Oggetto di quella classe e quindi è possibile accedere. e Con l'uso di @synthesize il compilatore genererà il setter e il getter per quella proprietà.

- (TIPO) nome; -getter Metodo

- (void) setName: (TIPO) aName; setter Metodo