Eiko e altri hanno dato le risposte corrette.
Ecco un modo più semplice: accedi direttamente alla variabile del membro privato.
Esempio
Nel file .h dell'intestazione:
@property (strong, nonatomic, readonly) NSString* foo;
Nel file .m di implementazione:
// inside one of my init methods
self->_foo = @"someString"; // Notice the underscore prefix of var name.
È tutto, è tutto ciò di cui hai bisogno. Niente confusione, niente confusione.
Dettagli
A partire da Xcode 4.4 e LLVM Compiler 4.0 ( nuove funzionalità in Xcode 4.4 ), non è necessario pasticciare con le faccende discusse nelle altre risposte:
- Il
synthesize
parola chiave
- Dichiarare una variabile
- Ri-dichiarazione della proprietà nel file .m di implementazione.
Dopo aver dichiarato una proprietà foo
, puoi presumere che Xcode abbia aggiunto una variabile membro privata denominata con un prefisso di sottolineatura:_foo
.
Se la proprietà è stata dichiarata readwrite
, Xcode genera un metodo getter denominato foo
e un setter denominato setFoo
. Questi metodi vengono chiamati implicitamente quando si utilizza la notazione punto (my Object.myMethod). Se la proprietà è stata dichiarata readonly
, non viene generato alcun setter. Ciò significa che la variabile di supporto, denominata con il carattere di sottolineatura, non è di per sé di sola lettura. Ilreadonly
mezzi semplicemente che nessun metodo setter è stato sintetizzato, e quindi utilizzando la notazione punto per impostare un valore non riesce con un errore di compilazione. La notazione del punto fallisce perché il compilatore ti impedisce di chiamare un metodo (il setter) che non esiste.
Il modo più semplice per aggirare questo problema è accedere direttamente alla variabile membro, denominata con il carattere di sottolineatura. Puoi farlo anche senza dichiarare quella variabile con nome di sottolineatura! Xcode sta inserendo quella dichiarazione come parte del processo di compilazione / compilazione, quindi il codice compilato avrà effettivamente la dichiarazione della variabile. Ma non vedi mai quella dichiarazione nel file del codice sorgente originale. Non magia, solo zucchero sintattico .
L'utilizzo self->
è un modo per accedere a una variabile membro dell'oggetto / istanza. Potresti essere in grado di ometterlo e usare semplicemente il nome var. Ma preferisco usare l'auto + freccia perché rende il mio codice auto-documentante. Quando vedi lo self->_foo
sai senza ambiguità che _foo
è una variabile membro in questa istanza.
Tra l'altro, la discussione dei pro e contro di accesso alle proprietà contro l'accesso diretto Ivar è esattamente il tipo di trattamento premuroso potrai leggere in Dr. Matt Neuberg s' Programmazione iOS libro. Ho trovato molto utile leggere e rileggere.