> В чем разница между 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в классическом примере).
Пример:
SWIFTclass Parent {var child: Child?}class Child {weak var parent: Parent? // weak, так как родитель может быть освобожденunowned var sibling: Child? // unowned, если sibling гарантированно существует}
В замыканиях предпочтительнее weak, если есть сомнения, и unowned только при полной уверенности в времени жизни объекта.
> Похожие задачи по mobile
Что такое MVVM и в чем отличие от MVC
Какой жизненный цикл у UIViewController и в каком порядке вызываются методы
Ты сейчас в активном поиске работы
Что такое принцип разделения интерфейса (Interface Segregation Principle)
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью