Mi az az unowned a Swift kontextusában?
sobes.tech MI
Válasz az MI-től
Unowned Swiftben az automatikus memória kezelésre (ARC) utal. Az unowned referenciák használata megakadályozza az erős hivatkozási ciklusokat, amikor két objektum kölcsönösen hivatkozik egymásra. Az unowned referencia nem növeli az objektum hivatkozási számlálóját. Ellentétben a weak referenciával, az unowned referencia mindig arra az példányra vár, hogy létezik; ha az általa hivatkozott példány felszabadul, a hozzáférési kísérlet futási időben hibát eredményez. Akkor használatos, amikor a kapcsolódó objektum életciklusa megegyezik vagy hosszabb, mint a unowned hivatkozást tartalmazó objektumé.
Használati példa:
class Department {
var name: String
var courses: [Course] = []
init(name: String) {
self.name = name
print("\(name) osztály inicializálva")
}
deinit {
print("\(name) osztály deinitializálva")
}
}
class Course {
var name: String
unowned var department: Department // Unowned gyenge referencia
init(name: String, department: Department) {
self.name = name
self.department = department
print("\(name) kurzus inicializálva")
}
deinit {
print("\(name) kurzus deinitializálva")
}
}
var accounting: Department? = Department(name: "Számvitel")
var introToAccounting: Course? = Course(name: "Bevezetés a számvitelbe", department: accounting!)
accounting!.courses.append(introToAccounting!)
accounting = nil // Most a Department objektum felszabadítható
introToAccounting = nil // Most a Course objektum felszabadítható
Ebben a példában a Course rendelkezik egy unowned referenciával a Department-re. Mivel a Course nem létezhet Department nélkül (logikusan), és a Department kezeli a Course életciklusát a courses tömbön keresztül, az unowned használata itt megfelelő. Ez megakadályozza az erős hivatkozási ciklust a accounting és az introToAccounting között. Amikor a accounting nil lesz, a Department objektum felszabadul, majd a Course objektum is, mivel már nincs rá erős hivatkozás.