Использует ли Swift сборщик мусора (Garbage Collector)?

«Использует ли Swift сборщик мусора (Garbage Collector)?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Swift использует Automatic Reference Counting (ARC) — полностью другой механизм управления памятью.

Ключевые отличия ARC от Garbage Collector (GC):

Аспект ARC (Swift) Традиционный GC (Java, C#)
Время работы Во время компиляции (добавляет retain/release) Во время выполнения (фоновый поток)
Детерминированность Память освобождается сразу при count = 0 Освобождение недетерминировано, происходит "когда-то"
Паузы (STW) Нет Возможны "stop-the-world" паузы
Циклические ссылки Требуют явного указания weak/unowned Могут определяться автоматически (в зависимости от GC)

Пример работы ARC:

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("(name) создан")
    }
    deinit {
        print("(name) уничтожен") // Вызывается немедленно при обнулении ссылок
    }
}

var person: Person? = Person(name: "Анна") // Счётчик = 1
var anotherRef = person // Счётчик = 2
person = nil // Счётчик = 1
anotherRef = nil // Счётчик = 0 -> мгновенно вызывается deinit

ARC работает только для ссылочных типов (классов). Значимые типы (структуры, перечисления) размещаются в стеке и не требуют подсчёта ссылок.