В чем разница между atomic и nonatomic свойствами в Objective-C?

«В чем разница между atomic и nonatomic свойствами в Objective-C?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Атрибуты atomic и nonatomic определяют потокобезопасность геттеров и сеттеров синтезированных свойств.

Атрибут Гарантии потокобезопасности Производительность Рекомендуемое использование
atomic (по умолчанию) Гарантирует целостность операции get или set. Чтение/запись значения завершатся полностью до доступа из другого потока. Ниже из-за накладных расходов на блокировку. Редко. Когда необходимо примитивное обеспечение целостности для отдельного свойства в многопоточной среде.
nonatomic Не дает гарантий. Одновременный доступ из нескольких потоков может привести к повреждению данных или сбоям. Выше, так как отсутствуют блокировки. Практически всегда для iOS/macOS, особенно для UI-компонентов, которые обновляются только в главном потоке.

Критически важное уточнение: atomic НЕ делает свойство или объект потокобезопасным. Он защищает только отдельную операцию чтения или записи, но не последовательность операций (например, «прочитать-изменить-записать»). Для настоящей потокобезопасности нужны более высокоуровневые механизмы (очереди, @synchronized, семафоры).

Пример объявления:

// Objective-C
@property (atomic, strong) NSString *atomicString; // Медленнее, базовая защита
@property (nonatomic, strong) NSString *nonatomicString; // Быстрее, стандартный выбор