> Какую ссылку лучше делать слабой в цикле сильных ссылок и почему (iOS, Swift)

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

Компании: Тинькофф

Стек: iOS, Swift

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

В цикле сильных ссылок (retain cycle) в Swift, например, между родительским и дочерним объектами, слабой (weak) обычно делают ссылку на тот объект, который имеет более короткое время жизни или является «нижестоящим» в иерархии. Классический пример - делегат или замыкание (closure).

Почему именно так:
В типичной архитектуре (например, ViewController → View) родительский объект (например, ViewController) владеет дочерним (View) через сильную ссылку. Если дочерний объект также будет держать сильную ссылку на родителя (например, через делегат или замыкание), возникает цикл. Чтобы его разорвать, ссылку на родителя со стороны дочернего объекта объявляют как weak. Это безопасно, потому что время жизни родителя обычно больше, и дочерний объект не должен препятствовать его освобождению.

Конкретный пример с замыканием:

SWIFT
class ViewController: UIViewController {
var viewModel: ViewModel?
func setup() {
viewModel = ViewModel()
viewModel?.onUpdate = { [weak self] in
self?.updateUI() // weak self, чтобы не удерживать ViewController
}
}
}

Здесь self (ViewController) захвачен слабо, так как ViewModel может жить дольше или быть переиспользована, и мы не хотим, чтобы замыкание удерживало контроллер в памяти.

Исключение: Если вы уверены, что время жизни дочернего объекта строго меньше родительского, можно использовать unowned (но это рискованно при случайном обращении к освобождённому объекту). weak предпочтительнее из-за безопасности.

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

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