Назад к вопросам
Middle
117
questionbank

Какие преимущества использования 'Unowned' в Swift?

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

  • Предотвращение циклических сильных ссылок (retain cycles).
  • Применяется, когда один объект имеет такую же или более длительную продолжительность жизни по сравнению с другим, и всегда будет иметь ссылку на этот другой объект.
  • Компилятор гарантирует, что ссылка 'unowned' всегда указывает на действительный объект. Если попытаться получить доступ к 'unowned' ссылке после освобождения объекта, приложение аварийно завершит работу. Это делает ошибки с 'unowned' более явными и помогает быстрее обнаружить проблемы.
  • Не добавляет счетчик ссылок объекту, что немного эффективнее с точки зрения производительности по сравнению со 'weak'.
class Person {
    let name: String
    var car: Car?

    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }

    deinit {
        print("\(name) is being deinitialized")
    }
}

class Car {
    let model: String
    unowned let owner: Person // Unowned reference to Person

    init(model: String, owner: Person) {
        self.model = model
        self.owner = owner // owner must not be nil
        print("\(model) is being initialized")
    }

    deinit {
        print("\(model) is being deinitialized")
    }
}

var kevin: Person? = Person(name: "Kevin")
var bmw: Car? = Car(model: "BMW", owner: kevin!) // Pass kevin as non-optional

kevin?.car = bmw

// Setting kevin to nil will deinitialize both objects,
// since owner is unowned and does not create a strong reference cycle.
kevin = nil
// Output:
// Kevin is being initialized
// BMW is being initialized
// Kevin is being deinitialized
// BMW is being deinitialized