Что произойдет при объявлении weak var user = User() в Swift?

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

Ответ

Объект User() будет немедленно освобожден (deallocated), так как weak-ссылка не увеличивает счетчик сильных ссылок (retain count). Созданный экземпляр не удерживается ни одной сильной ссылкой, поэтому ARC удаляет его сразу после инициализации.

Почему это происходит:

  • weak-ссылки в Swift являются опциональными и автоматически становятся nil, когда объект освобождается.
  • Они используются для предотвращения циклов сильных ссылок (strong reference cycles), но требуют, чтобы объект где-то удерживался сильной ссылкой.

Пример с ошибкой:

weak var user = User() // Предупреждение компилятора и немедленное освобождение
print(user) // nil

Правильное использование:

// 1. Создаем сильную ссылку
let strongUser = User()

// 2. Создаем weak-ссылку на тот же объект
weak var weakUser = strongUser

// 3. weakUser указывает на объект, пока существует strongUser
print(weakUser?.name) // Доступ к свойству через опциональную цепочку

Компилятор Swift выдаст предупреждение: "Instance will be immediately deallocated because property 'user' is 'weak'".