Что такое модификатор unowned в Swift и чем он отличается от weak?

«Что такое модификатор unowned в Swift и чем он отличается от weak?» — вопрос из категории Управление памятью, который задают на 33% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

unowned — это модификатор ссылки в Swift, который, как и weak, не увеличивает счетчик сильных ссылок (retain count), но с критическим отличием: он предполагает, что объект назначения никогда не станет nil в течение времени жизни ссылки. Если объект освобождается, обращение к unowned-ссылке вызывает краш приложения (dangling pointer).

Ключевые отличия от weak:

  • weak ссылки всегда optional (weak var delegate: Delegate?) и автоматически обнуляются (nil).
  • unowned ссылки non-optional (unowned let parent: Parent) и не обнуляются.

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

  • Когда время жизни объекта и ссылки совпадает или объект живет дольше.
  • Для устранения циклов сильных ссылок в отношениях, где один объект логически "владеет" другим (например, родитель-ребенок).

Пример безопасного использования:

class Customer {
    let id: String
    var card: CreditCard?
    init(id: String) { self.id = id }
}

class CreditCard {
    let number: String
    // Карта не может существовать без клиента. Клиент живет дольше.
    unowned let customer: Customer
    init(number: String, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

var john: Customer? = Customer(id: "12345")
john!.card = CreditCard(number: "1111-2222", customer: john!)
john = nil // Теперь и Customer, и CreditCard освобождены. Обращение к card.customer вызовет краш.

Правило: Используйте unowned только при абсолютной уверенности, что объект не будет освобожден раньше ссылки. В сомнительных случаях предпочитайте weak.