Действительно ли нужна блокировка в моем приложении для iPhone? - PullRequest
4 голосов
/ 26 января 2010

Я работаю над относительно простым приложением для iPhone, которое имеет многооборотный таймер с рядом настроек, таких как количество раундов и длина раунда. Мы разрешаем обновление определенных настроек во время работы таймера, что означает, что таймер может считывать данные из той же памяти, в которой записываются настройки. Не существует критических участков кода, в которых одновременно будут выполняться несколько потоков, но код из настроек может пытаться записать память, из которой читает таймер.

В простом примере, скажем, мы глобальная переменная foo и существует метод NSTimer, который выглядит следующим образом:

- (Недействительными) timerTick { NSString * x = foo; }

затем в коде настроек мы делаем это во время работы таймера:

foo = @ "test";

Будет ли этого достаточно, чтобы сделать foo атомарным в этом приложении, или нам нужна какая-то схема блокировки?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 января 2010

Обычно вам не нужно блокировать, когда вы используете NSTimer обычным способом.

Более подробно, когда вы создаете таймер с NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:, полученный таймер добавляется в цикл выполнения потока, в котором вы создаете таймер. Таким образом, если вы создаете экземпляр NSTimer в основном потоке таким образом, срабатывание таймера обрабатывается как часть основного цикла событий, поэтому зарегистрированный вами обратный вызов вызывается в основном потоке, а не в другом потоке. Так что, если вы не создаете поток самостоятельно, вам не нужно беспокоиться о блокировке и т. Д.

Подробнее см. this .

0 голосов
/ 26 января 2010

Вы можете либо @synchronized, либо NSLock / NSRecursiveLock / NSConditionLock читать и писать. Лучше использовать стандартные способы сделать это, чем рисковать преждевременно публиковать ноль фу.

...