Встречается на 36% собеседований по Mobile

Зачем нужен тип ссылок unnowned

Тип ссылок `unowned` используется для решения проблемы циклических ссылок без необходимости делать ссылку опциональной, как в случае с `weak`. Такие ссылки позволяют создавать несильные (non-strong) ссылки, которые не увеличивают счётчик ссылок на объект. Это предотвращает образование сильных циклических ссылок (strong reference cycles), когда два объекта ссылаются друг на друга сильно, что мешает автоматическому подсчёту ссылок (ARC) корректно освободить память.

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

`unowned` ссылке после того, как объект, на который она указывает, был уничтожен, приведёт к ошибке времени выполнения (runtime error).

Пример:

Рассмотрим класс `Customer`, который имеет ссылку на экземпляр класса `Order`. В свою очередь, каждый экземпляр `Order` должен знать, к какому `Customer` он относится. Если обе ссылки сделать сильными, это создаст циклическую ссылку, и объекты не будут освобождены. Используя `unowned`, можно избежать этой проблемы:

text
```swift
class Customer {
    var order: Order?
}

class Order {
    unowned var customer: Customer
    init(customer: Customer) {
        self.customer = customer
    }
}
```

В этом случае ссылка на `Customer` в классе `Order` помечена как `unowned`, что предотвращает циклическую сильную ссылку. Мы гарантируем, что `Order` не будет существовать без `Customer`, поэтому использование `unowned` безопасно и оправдано.

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

  • Когда вы уверены, что ссылка всегда будет указывать на объект в течение её срока жизни. Другими словами, когда жизненный цикл объекта, на который указывает `unowned` ссылка, превышает жизненный цикл самой ссылки.
  • Для предотвращения сильных циклических ссылок в случаях, когда использование опциональной `weak` ссылки не подходит из-за требований к логике программы или когда ссылка гарантированно не будет `nil` в течение своего использования.

Использование `unowned` требует понимания и аккуратности, поскольку неправильное использование может привести к ошибкам времени выполнения из-за обращения к уже освобождённой памяти.

April 10, 2024, easyoffer

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы