Sobes.tech
Назад к вопросам
Middle
118
questionbank

Что такое unowned в контексте Swift?

Sobes Copilot

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

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

sobes.tech AI

Unowned относится к автоматическому управлению памятью в Swift (ARC). Unowned ссылки используются для предотвращения циклов сильных ссылок, когда два объекта сильно ссылаются друг на друга. Unowned ссылка не увеличивает счетчик ссылок объекта. В отличие от weak ссылки, unowned ссылка всегда ожидается, что будет указывать на существующий экземпляр; если экземпляр, на который ссылается unowned ссылка, освобожден, попытка доступа приведет к ошибке времени выполнения (runtime error). Используется, когда жизненный цикл связанного объекта либо совпадает, либо больше жизненного цикла объекта, содержащего unowned ссылку.

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

class Department {
    var name: String
    var courses: [Course] = []

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

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

class Course {
    var name: String
    unowned var department: Department // Unowned слабая ссылка

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

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

var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Теперь объект Department может быть освобожден
introToAccounting = nil // Теперь объект Course может быть освобожден

В этом примере Course имеет unowned ссылку на Department. Поскольку Course не может существовать без Department (логически), и Department управляет жизненным циклом Course через массив courses, использование unowned здесь уместно. Это предотвращает сильный цикл ссылок между accounting и introToAccounting. Когда accounting становится nil, объект Department освобождается, а затем освобождается и объект Course, поскольку на него больше нет сильных ссылок.