Dire che ho una classe con un tipo di proprietà scalare:Il missaggio C pre/post incremento/decremento con operatore punto Objective-C funziona?
@property (nonatomic, assign) int myInt;
E per chiarezza, sintetizzati come:
@synthesize myInt = _myInt;
Se qualcuno mi avesse chiesto se la seguente riga avrebbe funzionato:
self.myInt++;
Avrei detto "No". La logica è che tutti sappiamo che l'operatore punto è solo zucchero sintattico per chiamare un metodo getter generato dal compilatore. In modo che la linea è letteralmente:
[self myInt]++;
Se si digita che seconda linea in Xcode, non si compila, affermando: "Assegnazione di 'sola lettura' risultato ritorno di un messaggio di Objective-C non consentito". Questo ha perfettamente senso, ed è quello che mi sarei aspettato. Anche se fosse stato compilato, mi sarei aspettato che il risultato aumentasse una copia del supporto in pila, non l'ivar stesso.
Ma l'istruzione self.myInt++
si compila e funziona. Funziona proprio come se quell'operatore di punti stia accedendo direttamente a _myInt. Fornendo le mie getter e setter, posso vedere che sia il getter e setter vengono utilizzati nel processo, in questo ordine, come se fosse in realtà:
[self setMyInt:[self myInt] + 1];
Quindi, questo è un eccezione alla regola che l'operatore punto è esattamente lo stesso di una chiamata al metodo o gli operatori {--, ++, +=, -=}
hanno ricevuto un'attenzione particolare dal compilatore Objective-C quando utilizzato con la notazione punto? Ho sempre pensato a loro come a un linguaggio C senza particolari considerazioni per Objective-C. Ho potuto vedere che la linea semplice è molto confusa con qualcuno che non ha familiarità con la notazione di punto Objective-C.
Do prefisso (++ self.myInt' ') si applicano anche? –
Guardando l'output del disassemblatore, vedo due 'objc_msgSend' quindi sì. Stai incrementando la proprietà. –