Le proprietà sono dei metodi che servono per esporre le variabili di istanza dell'oggetto che le dichiara al mondo esterno (incapsulamento). Possiamo avere proprietà di sola lettera, sola scrittura o lettura e scrittura.
Per convenzione i metodi delle proprietà hanno prefisso set e get seguito dal nome della variabile che intendono esporre. Il metodo con prefisso set
serve per impostare il valore della variabile, quello con prefisso get
serve per recuperare il valore della variabile.
In ObjectiveC 2.0 è stata introdotta una nuova sintassi per la dichiarazione delle proprietà che solleva il programmatore dalla scrittura dei metodi getter e setter nella maggior parte dei casi.
Questa sintassi si compone di due parti, una da inserire nel file di interfaccia l'altra da scrivere nel file di implementazione.
Sarà il compilatore poi a sostituire queste nostre dichiarazioni con i metodi getters e setters secondo le nostre indicazioni.
Interfaccia
Nel file di interfaccia le proprietà di PrimaClasse
vanno dichiarata nel seguente modo:
@property (assign, readwrite) int intero;
@property (retain, readwrite) NSString* stringa;
Nella parte tra parentesi tonda andranno inserite le informazioni necessarie al compilatore per scrivere correttamente il metodo setter della proprietà.
assign
Per default il compilatore assume che alla variabile di istanza sarà assegnato (assign
) il valore del parametro ricevuto (senza effettuare nessun retain
nel caso di oggetto). Inoltre, sempre per default, nel metodo non sarà generato alcun codice per trattare il multithreading, ad esempio il lock prima dell'assegnazione.
readwrite
La definizione readwrite
, che è il comportamento di default, significa che saranno generati sia il setter, sia il getter. Per definire una proprietà di sola lettura, possiamo eliminare il setter, scrivendo read
, se invece la proprietà dovrà essere solo scritta si elimina il getter scrivendo solo write
.
Impostazioni di default
Un metodo setter, per default, soddisferà le condizioni di atomic
, assign
e readwrite
.
Per le proprietà che incapsulano una variabile di tipo scalare (non vale quindi per oggetti e collezioni) gli argomenti possibili saranno assing
, atomic
o nonatomic
e i modificatori di visibilità (read
, write
, readwrite
).
retain e copy
Quando si specifica retain
il codice generato invierà, all'interno del metodo, un messaggio di retain
alla variabile ricevuta come argomento. Se si specifica copy
la variabile di istanza sarà assegnata ad un clone, e quindi la variabile di istanza sarà indipendente per quanto riguarda la gestione di memoria dal parametro ricevuto.
retain
, assign
, e copy
sono mutualmente esclusive cioè se si inserisce una parola chiave non possono essere utilizzate le altre due; lo stesso dicasi per atomic
e nonatomic
e per read
, write
, readwrite
.