Что такое Garbage Collector и как управление памятью работает в Swift?

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

Ответ

Garbage Collector (GC) — алгоритм автоматического управления памятью, который периодически находит и удаляет неиспользуемые объекты. В Swift/Objective-C для iOS/macOS GC не используется — вместо него применяется ARC (Automatic Reference Counting).

ARC vs Garbage Collector:

Критерий ARC (Swift/Objective-C) Garbage Collector (Java/C#)
Принцип работы Подсчёт ссылок во время компиляции/выполнения Периодическое сканирование «живых» объектов
Время освобождения Немедленно при достижении счётчиком нуля Неопределённое (при срабатывании GC)
Производительность Предсказуемая, без пауз Возможны stop-the-world паузы
Циклические ссылки Требуют weak/unowned Автоматически обнаруживаются

Пример ARC в Swift:

class User {
    let name: String
    var friend: User? // Сильная ссылка → возможен retain cycle

    init(name: String) { self.name = name }
    deinit { print("(name) удалён из памяти") }
}

// Создаём циклическую ссылку
var alice: User? = User(name: "Alice")
var bob: User? = User(name: "Bob")
alice?.friend = bob  // Alice → Bob
bob?.friend = alice  // Bob → Alice (цикл!)

alice = nil  // Память НЕ освобождается!
bob = nil    // Оба объекта всё ещё в памяти

Решение с weak reference:

class User {
    let name: String
    weak var friend: User? // ← Слабая ссылка разрывает цикл

    init(name: String) { self.name = name }
}

// Теперь при alice = nil и bob = nil память корректно освобождается

Ключевые механизмы Swift:

  • Strong — обычная ссылка (увеличивает счётчик)
  • Weak — не удерживает объект (автоматически становится nil)
  • Unowned — как weak, но предполагает, что объект существует (краш при обращении к освобождённому)
  • Autorelease pools — для Objective-C совместимости, отложенное освобождение