Wat betekent unowned in de context van Swift?
sobes.tech AI
Antwoord van AI
Unowned verwijst naar automatisch geheugenbeheer in Swift (ARC). Unowned referenties worden gebruikt om sterke referentiecycli te voorkomen wanneer twee objecten elkaar sterk verwijzen. Een unowned referentie verhoogt de referentieteller van het object niet. In tegenstelling tot een weak referentie, wordt van een unowned referentie altijd verwacht dat deze wijst naar een bestaande instantie; als de instantie waarnaar de unowned referentie wijst wordt vrijgegeven, leidt een poging tot toegang tot een runtime-fout. Het wordt gebruikt wanneer de levensduur van het gerelateerde object gelijk is aan of langer dan die van het object dat de unowned referentie bevat.
Voorbeeld van gebruik:
class Department {
var name: String
var courses: [Course] = []
init(name: String) {
self.name = name
print("\(name) afdeling wordt geïnitialiseerd")
}
deinit {
print("\(name) afdeling wordt gedeinitialiseerd")
}
}
class Course {
var name: String
unowned var department: Department // Unowned zwakke referentie
init(name: String, department: Department) {
self.name = name
self.department = department
print("\(name) cursus wordt geïnitialiseerd")
}
deinit {
print("\(name) cursus wordt gedeinitialiseerd")
}
}
var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)
accounting!.courses.append(introToAccounting!)
accounting = nil // Nu kan het Department-object worden vrijgegeven
introToAccounting = nil // Nu kan het Course-object worden vrijgegeven
In dit voorbeeld heeft Course een unowned verwijzing naar Department. Omdat Course niet zonder Department kan bestaan (logisch), en Department de levenscyclus van Course beheert via de array courses, is het gebruik van unowned hier passend. Dit voorkomt een sterke referentiecyclus tussen accounting en introToAccounting. Wanneer accounting op nil wordt gezet, wordt het Department-object vrijgegeven, en daarna wordt ook het Course-object vrijgegeven omdat er geen sterke verwijzingen meer naar zijn.