2011-10-29 10 views
15

Decir que tengo una clase con un escalar tipo de propiedad:Mezclar C pre/post incremento/decremento con el operador de punto Objective-C funciona?

@property (nonatomic, assign) int myInt; 

Y para mayor claridad, sintetizados como:

@synthesize myInt = _myInt; 

Si alguien me hubiera preguntado si la línea siguiente funcionaría:

self.myInt++; 

Hubiera dicho "No". La razón fundamental es que todos sabemos que el operador punto es simplemente azúcar sintáctica para llamar a un método getter generado por el compilador. De manera que la línea es literalmente:

[self myInt]++; 

Si escribe esa segunda línea en Xcode, que no se compilará, declarando: "Asignar a 'sólo lectura' return resultado de un mensaje de Objective-C no permitido". Esto tiene mucho sentido, y es lo que esperaba. Incluso si eso se compilara, hubiera esperado que el resultado incrementara una copia del ivar de respaldo en la pila, no el ivar mismo.

Pero, la instrucción self.myInt++ se compila, y funciona. Funciona igual que si ese operador de punto estuviera accediendo directamente a _miInt. Mediante el suministro de mis propios captadores y definidores, puedo ver que tanto el comprador y el colocador se utilizan en el proceso, en ese orden, al igual que en realidad era:

[self setMyInt:[self myInt] + 1]; 

Por lo tanto, es esta una excepción a la regla de que el operador punto es exactamente lo mismo que una llamada a un método, o los operadores {--, ++, +=, -=} reciben atención especial del compilador Objective-C cuando se utilizan con notación de puntos? Siempre he pensado en ellos como características del lenguaje C sin consideraciones especiales para Objective-C. Pude ver que la línea simple era muy confusa para alguien que no estaba familiarizado con la notación de puntos de Objective-C.

Respuesta

11

Puede ver la salida del ensamblador y ver que genera dos llamadas _objc_msgSend.

supongo que es más un caso de aplicar la regla de que a++ es el azúcar sintáctica para a = a + 1

operadores
+0

Do prefijo ('++ self.myInt') se aplican también? –

+0

Al mirar la salida del desensamblador, veo dos 'objc_msgSend' así que sí. Estás incrementando la propiedad. –

Cuestiones relacionadas