Ответ
Атрибуты atomic и nonatomic определяют потокобезопасность геттеров и сеттеров синтезированных свойств.
| Атрибут | Гарантии потокобезопасности | Производительность | Рекомендуемое использование |
|---|---|---|---|
atomic (по умолчанию) |
Гарантирует целостность операции get или set. Чтение/запись значения завершатся полностью до доступа из другого потока. |
Ниже из-за накладных расходов на блокировку. | Редко. Когда необходимо примитивное обеспечение целостности для отдельного свойства в многопоточной среде. |
nonatomic |
Не дает гарантий. Одновременный доступ из нескольких потоков может привести к повреждению данных или сбоям. | Выше, так как отсутствуют блокировки. | Практически всегда для iOS/macOS, особенно для UI-компонентов, которые обновляются только в главном потоке. |
Критически важное уточнение:
atomic НЕ делает свойство или объект потокобезопасным. Он защищает только отдельную операцию чтения или записи, но не последовательность операций (например, «прочитать-изменить-записать»). Для настоящей потокобезопасности нужны более высокоуровневые механизмы (очереди, @synchronized, семафоры).
Пример объявления:
// Objective-C
@property (atomic, strong) NSString *atomicString; // Медленнее, базовая защита
@property (nonatomic, strong) NSString *nonatomicString; // Быстрее, стандартный выбор