Как работает подсчет ссылок (ARC) в Swift?

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

Ответ

Automatic Reference Counting (ARC) — это механизм Swift для управления памятью, который автоматически подсчитывает сильные (strong) ссылки на экземпляры классов.

Принцип работы:

  1. При создании сильной ссылки на объект его счетчик ссылок (retain count) увеличивается на 1.
  2. Когда ссылка выходит из области видимости или ей присваивается nil, счетчик уменьшается на 1.
  3. Когда счетчик достигает нуля, память, занятая объектом, немедленно освобождается, и вызывается его деинициализатор deinit.

Пример:

class Person {
    let name: String
    init(name: String) { self.name = name; print("(name) создан") }
    deinit { print("(name) удален") }
}

var reference1: Person? = Person(name: "Анна") // Счетчик = 1
var reference2: Person? = reference1 // Счетчик = 2 (новая сильная ссылка)

reference1 = nil // Счетчик = 1
reference2 = nil // Счетчик = 0 -> Срабатывает deinit, объект удален
// В консоли:
// Анна создан
// Анна удален

Важные нюансы:

  • ARC учитывает только сильные ссылки. Слабые (weak) и бесхозные (unowned) ссылки не увеличивают счетчик.
    • weak: Используется для избежания циклов сильных ссылок. Становится nil, когда объект уничтожается. Всегда объявляется как var и optional.
    • unowned: Предполагает, что объект будет существовать дольше ссылки. Не становится nil (при обращении к разрушенному объекту приведет к крашу).