Что такое 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, поскольку на него больше нет сильных ссылок.