In Objective C gli attributi di una classe vengono definiti come attributi privati. Ciò vuol dire che dall’esterno è impossibile, in maniera diretta, modificare o sapere il valore di un determinato attributo.
Nella programmazione ad oggetti, ogni attributo di una classe dovrebbe essere sempre privato per poter implementare il concetto di incapsulamento. Per poter accedere agli attributi, solitamente, vengono creati dei metodi di set e di get da utilizzarsi per conoscerne e modificarne il valore.
La scrittura dei metodi set e get è un operazione abbastanza noiosa e che richiede diverso tempo, in particolar modo se abbiamo a che fare con classi con molti attributi. L’Objective C viene incontro a questa esigenza, agevolando la scrittura di questi metodi utilizzando i costrutti @property e @synthesize.
@property
Le direttive @property devono essere inserite sempre all’interno del file header e devono essere definite seguendo la seguente struttura:
@property(attributi) tipoAttributo NomeAttributo
Focalizziamo adesso la nostra attenzione sugli attributi che una property può ricevere in ingresso, dato che le altre parti della sintassi sono di intuibile comprensione. A seconda di ciò che inseriremo nella property, verranno creati i rispettivi metodi per l’accesso all’attributo; per esempio, se si vuole creare solo il metodo set inseriremo un certo attributo, mentre se vogliamo creare sia il metodo set che quello get ne inseriremo un altro.
Vediamo adesso quali attributi è possibile inserire nelle property:
- readwrite: indica che è richiesto sia il metodo get che il metodo set dell’attributo.
- readonly: indica che è richiesto solo il metodo get del’attributo.
- assign: indica che il metodo set userà semplicemente un assegnamento. Si usa principalmente per attributi scalari come per esempio int e float.
- retain: incrementa di uno il contatore che gestisce i riferimenti all’oggetto. Questo argomento verrà trattato più approfonditamente quando parleremo della memoria.
- copy:indica che una copia dell’oggetto viene usata per l’assegnamento.
- nonatomic: indica che il metodo che verrà creato avrà la caratteristica di atomicità. Ciò è indispensabile si si usano, nell’applicazioni, i thread per garantire la consistenza dei dati.
E’ possibile utilizzare più attributi nelle property concatenandoli semplicemente con una virgola. Alcuni attributi sono, però, mutuamente esclusivi e ciò vuol dire che non possono essere usati entrambi in una dichiarazione di una property. Infatti non è consentito utilizzare insieme l’attributo readwrite e readonly, come pure non è consentito usare, in una stessa dichiarazione, assign, copy e retain.
Vediamo dunque un esempio di dichiarazione di property relative alla classe d’esempio mostrata nel capitolo precedente:
@property(nonatomic,readwrite) int numero;
@property(nonatomic,retain) NSString * miaStringa;
E’ bene ricordare che la dichiarazione della property deve essere inserita, nel file header, sotto il blocco di codice che definisce gli attributi della classe.
@synthesize
Una volta dichiarati i tipi di metodi per l’accesso agli attributi, dobbiamo crearli utilizzando il costrutto @synthesize.
Spostiamoci ora all’interno del file di implementazione ed inseriamo il synthesize subito dopo @implementation MiaClasse.
Segue un esempio relativo all’uso di questo costrutto:
@synthesize numero;
@synthesize miaStringa;
Come possiamo vedere la dichiarazione del @synthesize è estremamente semplice.
Ricapitolando possiamo dire che con il costrutto @property andiamo solamente a definire il comportamento dei metodi set e get. Con il costrutto @synthesize andremo a creare, realmente, questi metodi seguendo le specifiche dichiarate nelle property.
Fornendoci questo strumento, l’Objective C ci permette di ridurre notevolmente il codice da scrivere per quanto riguarda i metodi di accesso agli attributi.