В чём отличие weak от unowned и когда лучше применять unowned?

Чем отличаются weak и unowned в Swift и в каких случаях выбирают unowned? weak — ссылка, которая при уничтожении объекта может стать nil; поэтому она всегда Optional unowned — слабая ссылка без Optional,…

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

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

Чем отличаются weak и unowned в Swift и в каких случаях выбирают unowned? weak — ссылка, которая при уничтожении объекта может стать nil; поэтому она всегда Optional unowned — слабая ссылка без Optional, предполагающая, что объект существует в момент обращения weak безопаснее, однако требует разворачивания Optional При обращении к уже освобождённому объекту через unowned приложение завершится с ошибкой unowned выбирают для связанных объектов с одинаковым жизненным циклом (например, для владельца и подкласса), если порядок их создания и удаления гарантирован weak применяют, когда время жизни объектов может различаться: это помогает…

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

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

Чем отличаются weak и unowned в Swift и в каких случаях выбирают unowned?

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

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

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

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

weak и unowned — два механизма слабых ссылок в Swift, применяемых для предотвращения retain cycle. При этом они по-разному ведут себя, если целевой объект уже освобождён. Ссылка weak становится nil после уничтожения объекта, поэтому она всегда optional и безопасна при использовании. unowned — неконтролируемая слабая ссылка: она не принимает значение nil и предполагает, что объект существует в момент обращения. Если это условие нарушено, произойдёт runtime crash.

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

  • weak всегда является Optional и автоматически обнуляется во время деинициализации объекта. Такой вариант подходит, если ссылка в течение работы программы действительно может стать nil, например у делегата, который не обязан присутствовать постоянно.
  • unowned не является Optional и не обнуляется. Его применяют, когда заранее гарантировано, что ссылка будет действительной всё время существования объекта. Пример — связь "родитель-ребёнок" в жёсткой иерархии, где жизненный цикл child зависит от parent.
  • unowned стоит предпочесть, если при каждом обращении объект точно существует, например для связанных объектов в пределах одного scope. Это убирает необходимость проверять Optional и позволяет сделать код чище, однако требует осторожности: нарушение гарантии приведёт к падению.

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

В проектах на UIKit weak часто применяют для делегатов и замыканий: это помогает разорвать retain cycle и автоматически обнулить ссылку после освобождения объекта. unowned используют для связи вложенных объектов, например в графах или между ViewController и его внутренним менеджером, когда жизненный цикл менеджера жёстко связан с контроллером и дополнительная проверка Optional не требуется. Такой выбор уменьшает overhead и повышает производительность, сохраняя безопасность программного кода.

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

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

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

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