Вы должны убедиться, что любые изменения в изменяемом массиве происходят в одном потоке. Это позволит избежать «столкновений». Если ваш таймер срабатывает в основном потоке, и ваш обратный вызов также встречается в основном потоке, все хорошо.
Если таймер и обратный вызов находятся в разных потоках, вы можете сериализовать доступ к массиву с помощью последовательной очереди GCD. Когда вы это делаете, ЛЮБОЙ И ВСЕ доступ к этому массиву должен выполняться в этой очереди (например, сохраняйте ссылку на эту очередь в свойстве).
NSLock может вам помочь, но если вы работаете над основным потоком, это, как правило, не очень хорошая идея, так как вы можете блокировать основную очередь, которая влияет на поведение пользователя/прокрутку.
Кроме того, атомный только означает, что получение или установки указатель на массив является поточно, т.ми .: действительного значение будет возвращено или установить (DORS не означает, что она будет правильно значения, хотя). Любые операции, которые вы делаете на этом, не имеют ничего общего с тем, что свойство является атомарным или неатомоксным.
Вы используете несколько потоков? Если нет, таймер не загорится, пока не закончится другой код. Таймеры не срабатывают до следующего раза, когда ваш код вернется и посещает цикл событий. –
Независимо от того, что вы делаете, имейте в виду, что только блокировка может не решить все ваши проблемы, то есть даже если каждый доступ к массиву заблокирован, этого может быть недостаточно, чтобы сделать его потокобезопасным. Быстрый пример: более длительная операция, требующая множественного доступа к массиву, но массив, возможно, изменился между ними. – Eiko