Что такое strong, weak и unowned в Swift и чем отличаются weak и unowned?

Ссылки strong, weak и unowned в Swift: сравнение weak и unowned strong — ссылка удерживает объект и не даёт удалить его из памяти weak — неудерживающая ссылка, которая может стать nil после удаления объекта unowned —…

Короткий ответ

Что ответить на собеседовании

Ссылки strong, weak и unowned в Swift: сравнение weak и unowned strong — ссылка удерживает объект и не даёт удалить его из памяти weak — неудерживающая ссылка, которая может стать nil после удаления объекта unowned — неудерживающая ссылка без optional, рассчитанная на существующий объект weak — опциональный тип, автоматически обнуляется при освобождении объекта unowned — неопциональный тип, НЕ обнуляется, поэтому обращение после удаления объекта может привести к крашу weak применяют для циклических зависимостей, при которых объект может исчезнуть unowned выбирают, когда связь короче жизни объекта и считается неизменной оба варианта…

Подробный разбор

Ответ с пояснениями

Ссылки strong, weak и unowned в Swift: сравнение weak и unowned

  • strong — ссылка удерживает объект и не даёт удалить его из памяти
  • weak — неудерживающая ссылка, которая может стать nil после удаления объекта
  • unowned — неудерживающая ссылка без optional, рассчитанная на существующий объект
  • weak — опциональный тип, автоматически обнуляется при освобождении объекта
  • unowned — неопциональный тип, НЕ обнуляется, поэтому обращение после удаления объекта может привести к крашу
  • weak применяют для циклических зависимостей, при которых объект может исчезнуть
  • unowned выбирают, когда связь короче жизни объекта и считается неизменной
  • оба варианта помогают избежать retain cycle, но различаются безопасностью и правилами времени жизни
  • на практике weak используют для делегатов, а unowned — для вложенных объектов и замыканий
  • strong используется по умолчанию и определяет время жизни объекта

Итог: weak безопаснее и универсальнее, тогда как unowned эффективнее, но требует полной уверенности в жизненном цикле связанного объекта.

Подробный ответ

Основной ответ

В Swift предусмотрены три вида ссылок — strong, weak и unowned. Они определяют правила управления памятью и помогают предотвращать циклы удержания (retain cycles).

  • Strong является обычной сильной ссылкой. При присваивании она увеличивает счётчик ссылок объекта, поэтому объект сохраняется в памяти, пока существует хотя бы одна strong-ссылка.
  • Weak не удерживает объект и не увеличивает его счётчик ссылок. Если объект деаллоцируется, такая ссылка автоматически принимает значение nil.
  • Unowned также не увеличивает счётчик ссылок, но не поддерживает optional и не может хранить nil. Обращение к ней после деаллокации объекта приводит к крашу.

Ключевые моменты

  • Weak-ссылки всегда объявляются опциональными (var delegate: SomeDelegate?), поскольку после деаллоцирования объекта они могут в любой момент обнулиться.
  • Unowned выбирают, когда известно, что связанный объект проживёт дольше ссылочного объекта или столько же, например в отношении родителя и ребёнка. Это позволяет не использовать optional.
  • Trade-off: weak безопаснее, поскольку сам по себе не приводит к крашу, однако требует обработки nil. unowned удобнее и быстрее, но ошибочное предположение о времени жизни объекта завершится сбоем.

Сравнение weak vs unowned

| Свойство | Weak | Unowned | Тип | Опциональный | Неопциональный | Поведение при деаллокации | Автоматически принимает nil | В nil не превращается, происходит краш | Контекст использования | Если объект может исчезнуть раньше | Если объект живёт дольше или столько же | Пример | Делегат, который может быть удалён первым | Связь родителя и ребёнка, если ребёнок не живёт дольше родителя

Практический контекст

Обычно weak применяют для делегатов и замыканий, когда важно избежать retain cycle и безопасно пережить удаление объекта. Unowned подходит для пары объектов с чётко заданной иерархией времени жизни — например, контейнера и вложенных элементов, — чтобы не выполнять лишний Optional unwrap. В Swift 5.7+ конструкция unowned(unsafe) даёт ещё более тонкий контроль, однако стандартно используют описанные типы.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку