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.
fonte
2009-07-08 11:36:52
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
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. –
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