> В чем разница между weak и unowned ссылками в Swift и когда их использовать (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Wildberries, SimbirSoft, nuum, VK, Bip.ru, Doubletapp, Совкомбанк, Masterdata, Тинькофф, Eltex, Яндекс

Стек: iOS, Swift

> Пример ответа

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

weak - это опциональная ссылка (Optional). Когда объект, на который она указывает, освобождается, ссылка автоматически становится nil. Это безопасно, так как при попытке доступа к ней вы получаете nil и можете обработать ситуацию. Используется, когда объект может быть освобожден в любой момент, например, в делегатах или замыканиях, где время жизни объекта не гарантировано.

unowned - это неопциональная ссылка (non-Optional). Она предполагает, что объект будет жить как минимум столько же, сколько и сама ссылка. Если объект освобождается, а unowned ссылка остается, обращение к ней вызовет краш (runtime error). Используется, когда вы уверены, что объект не будет освобожден раньше ссылки, например, в связке родитель-ребенок, где ребенок всегда существует только при наличии родителя.

Когда что использовать:

  • weak - когда объект может быть nil (например, делегаты, замыкания с захватом self, где self может быть освобожден).

  • unowned - когда объект гарантированно существует (например, в циклических зависимостях, где один объект не может существовать без другого, как Customer и CreditCard в классическом примере).

Пример:

SWIFT
class Parent {
var child: Child?
}
class Child {
weak var parent: Parent? // weak, так как родитель может быть освобожден
unowned var sibling: Child? // unowned, если sibling гарантированно существует
}

В замыканиях предпочтительнее weak, если есть сомнения, и unowned только при полной уверенности в времени жизни объекта.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью