Programmazione iOS e Mac (Le Proprietà)@property

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