La palabra clave volatile
también existe en Objective-C. Puedes usarlo.
Esto se debe a Objective-C es un superconjunto de C.
declarar las propiedades como atomic
no corregirá lo volatile
estaba destinado a hacer. volatile
efectivamente le dice al compilador que no optimice las comprobaciones realizadas en esa variable, porque puede haber cambiado cuando el compilador esperaba que no cambiara.
El ejemplo más simple es este. Digamos que tenemos declara una variable global como:
int packetsReceived = 0;
Y se utilizó más adelante como esto:
packetsRecieved = 0;
while (packetsRecieved < 10){
//Wait for more packets
}
processPackets();
Nunca vamos a conseguir a través de ese bucle, porque el compilador dirá "Hey, packetsRecieved
no se modifica en ese bucle, por lo tanto, se ejecutará infinitamente ". Como resultado, solo lo convertirá en un bucle infinito recto, por lo que puede evitar tener que verificarlo todo el tiempo.
Si en cambio se había declarado la variable como:
volatile int packetsRecieved;
Le estamos diciendo al compilador que esta variable puede cambiar en cualquier momento, incluso cuando parece que debería permanecer igual. Por lo tanto, en nuestro ejemplo, el código máquina generado por el compilador seguirá controlando la condición y nuestro programa funcionará como se espera.
Realmente no conozco el equivalente en Objective-C, pero puedo decir que "volátil" en Java no se trata de atomicidad: se trata de almacenar en caché. Una variable miembro volátil no se almacenará en caché en un registro, sino que se recuperará de la memoria cada vez que se necesite su valor. –
Es extremadamente poco común que se necesite 'volátil' en Objective-C (más o menos solo para direccionamiento de hardware). Si cree que necesita volátiles, casi siempre es el caso que lo está haciendo mal. – bbum