2011-10-29 11 views
15

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.

risposta

11

È possibile guardare l'output dell'assembler e vedere che genera due chiamate _objc_msgSend.

direi che è più un caso di applicazione della regola che a++ è zucchero sintattico per a = a + 1

operatori
+0

Do prefisso (++ self.myInt' ') si applicano anche? –

+0

Guardando l'output del disassemblatore, vedo due 'objc_msgSend' quindi sì. Stai incrementando la proprietà. –