Ключевое слово volatile
существует и в Objective-C. Вы можете использовать его.
Это потому, что Objective-C является надмножеством C.
Объявление свойств как atomic
не исправит то, что предполагалось сделать volatile
. volatile
фактически говорит компилятору не оптимизировать проверки, выполненные для этой переменной, потому что она могла измениться, когда компилятор ожидал, что она останется прежней.
Простейший пример это. Скажем, у нас есть глобальная переменная, объявленная как:
int packetsReceived = 0;
И позже он используется так:
packetsRecieved = 0;
while (packetsRecieved < 10){
//Wait for more packets
}
processPackets();
Мы никогда не пройдем через этот цикл, потому что компилятор скажет: «Эй, packetsRecieved
никогда не изменяется в этом цикле, поэтому он будет работать бесконечно». В результате, он просто сделает это бесконечным прямым циклом, чтобы избежать необходимости проверять каждый раз.
Если бы мы вместо этого объявили переменную как:
volatile int packetsRecieved;
Мы говорим компилятору, что эта переменная может измениться в любое время, даже если она выглядит так, как будто должна оставаться прежней. Таким образом, в нашем примере машинный код, сгенерированный компилятором, все еще будет проверять условие, и наша программа будет работать как положено.