Что происходит с объектом в Swift, когда количество сильных ссылок на него становится равным нулю?

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

Ответ

Объект немедленно освобождается системой автоматического подсчёта ссылок (ARC).

Процесс освобождения:

  1. Вызывается деинициализатор deinit (если он определён)
  2. Память, занимаемая объектом, возвращается системе
  3. Все weak-ссылки на объект становятся nil

Пример:

class User {
    let name: String

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

    deinit {
        print("Объект User с именем (name) удалён")
    }
}

var user: User? = User(name: "Анна") // Сильная ссылка: 1
var weakRef = user // Это не weak-ссылка!

user = nil // Сильная ссылка: 0 → срабатывает deinit
// Вывод: "Объект User с именем Анна удалён"

Ключевые моменты:

  • Только сильные ссылки влияют на счётчик. Weak/unowned ссылки не увеличивают счётчик.
  • Циклические ссылки создают утечки памяти. Используйте weak или unowned для их разрыва.
  • Структуры (struct) не используют ARC, так как являются типами-значениями.

Проверка в коде:

class Example {
    deinit { print("Deinit called") }
}

var example: Example? = Example()
print(CFGetRetainCount(example)) // Примерно 2 (не используйте в production)
example = nil // "Deinit called"