Le proprietà sollevano il programmatore dal compito di creare la coppia di metodi get/set per poter accedere alle variabili di istanza. Grazie alle properties il compilatore è in grado di generare automaticamente il codice per l’accesso alle variabili di istanza al di fuori della classe.
La dichiarazione di una proprietà fa uso della direttiva @property e può comparire ovunque nella sezione dell’interfaccia dedicata ai metodi.
La direttiva @synthesize nella sezione relativa all’implementazione ordina al compilatore di creare (sintetizzare) i metodi ‘get/set’.
La direttiva @dynamic informa il compilatore che tali metodi verranno aggiunti a run-time dall’utente
Esempio
//—– file interfaccia —–
@interface MiaClasse : NSObject {
NSString *value; }
@property(copy, readwrite)NSString *value; @end
//—– file implementazione —–
@implementation MyClass
@synthesize value;
@end
Per accedere alla variabile istanza value si ricorre alla notazione punto ‘.’:
MiaClasse *miaClasse = [[MiaClasse alloc] init];
miaClasse.value = @”New Value”;
NSLog(@”miaClasse=%@”, miaClasse);
…………………………………………
Si precisa che essendo impostata come default la direttiva @dynamic,qualora non si specifichi la modalità di creazione della proprietà (@synthesize o @dynamic) occorre fornire una coppia get/set o al minimo anche una delle due (tipicamente la get).
La dichiarazione della proprietà prevede la specifica di alcuni attributi:
readonly : La proprietà è in sola lettura. Se si tenta di modificarne il valore si ottiene un errore in compilazione. E’ richiesta solo la ‘get’ oppure se specificata la @synthesize verrà creata automaticamente solo la ‘get’
readwrite : La proprietà è sia in lettura che in scrittura (default).
sono richiesti entrambi i metodi ‘get/set’ oppure se specificata
la @synthesize verranno creati automaticamente sia ‘get’ che ‘set’
assign : Assegnamento semplice (default)
retain : Viene effettuata una retain dopo l’assegnamento. Attributo valido solo per tipi Objective-C
copy : Viene effettuato l’assegnamento tramite una copia dell’oggetto.
Se non si fa uso di Garbage Collection, occorre specificare uno dei tre parametri assign, retain o copy, altrimenti si ottiene un warning dal compilatore
Se si desidera accedere ad una proprietà dell’oggetto corrente occorre farlo attraverso self, altrimenti si
accede alla variabile istanza direttamente:
Esemio
self.altezza = 10.0; // Accedo tramite proprietà altezza = 10.0 // Accedo direttamente