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.
Do prefijo ('++ self.myInt') se aplican también? –
Al mirar la salida del desensamblador, veo dos 'objc_msgSend' así que sí. Estás incrementando la propiedad. –