Будет ли объект в Swift (ARC) освобожден, если на него указывает одна сильная (strong), три слабых (weak) и одна бесхозная (unowned) ссылка?

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

Ответ

Да, объект будет немедленно освобожден (деинициализирован) при обнулении последней сильной ссылки. Слабые (weak) и бесхозные (unowned) ссылки не увеличивают счетчик ссылок (retain count), поэтому не влияют на время жизни объекта.

Механика:

class Example { deinit { print("Объект освобожден") } }

var strongRef: Example? = Example() // Retain count = 1
weak var weakRef1 = strongRef       // Retain count = 1
weak var weakRef2 = strongRef       // Retain count = 1
weak var weakRef3 = strongRef       // Retain count = 1
unowned var unownedRef = strongRef! // Retain count = 1

strongRef = nil // Retain count становится 0 -> объект освобождается.
// Консоль: "Объект освобожден"

// Последствия:
print(weakRef1)     // nil
print(weakRef2)     // nil
print(weakRef3)     // nil
// print(unownedRef) // КРАШ! Попытка доступа к освобожденному объекту через unowned.

Ключевые различия ссылок:

  • strong: Удерживает объект живым. Увеличивает retain count.
  • weak: Не удерживает объект. Автоматически становится nil после освобождения объекта. Безопасна.
  • unowned: Не удерживает объект. Не становится nil. Предполагает, что объект проживет дольше ссылки. Опасна при неправильном использовании (краш).

Вывод: Для освобождения памяти важен только счетчик сильных ссылок.