Что такое потокобезопасность в iOS?

«Что такое потокобезопасность в iOS?» — вопрос из категории Многопоточность, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Потокобезопасность — свойство кода корректно работать в многопоточной среде, предотвращая состояния гонки (race conditions) и повреждение данных.

Основные механизмы в iOS:

  1. Serial DispatchQueue — последовательная очередь гарантирует выполнение одной задачи за раз:

    let serialQueue = DispatchQueue(label: "com.example.serial")
    serialQueue.async {
    // Безопасный доступ к общему ресурсу
    }
  2. Синхронизация через примитивы:

    • NSLock, os_unfair_lock (более эффективный)
    • DispatchSemaphore для контроля доступа к ограниченному числу ресурсов
  3. Атомарные свойства через property wrapper:

    @propertyWrapper
    struct Atomic<Value> {
    private var value: Value
    private let lock = NSLock()
    
    var wrappedValue: Value {
        get { lock.withLock { value } }
        set { lock.withLock { value = newValue } }
    }
    }
  4. Actor (Swift 5.5+) — автоматическая синхронизация доступа:

    
    actor Counter {
    private var value = 0
    func increment() { value += 1 }
    func getValue() -> Int { value }
    }

// Использование: let counter = Counter() Task { await counter.increment() let current = await counter.getValue() }



**Best practices:**
- Избегайте общего изменяемого состояния между потоками
- Для UI-обновлений всегда используйте `DispatchQueue.main`
- Предпочитайте value types (структуры) reference types (классы) где возможно
- Используйте `@MainActor` для изоляции UI-кода