Mis on unowned Swift kontekstis?
sobes.tech AI
Vastus AI-lt
Unowned viitab Swifti automaatsele mäluhaldu (ARC) kontekstis. Unowned viited kasutatakse tugevate viidete tsüklite vältimiseks, kui kaks objekti viitavad üksteisele tugevalt. Unowned viide ei suurenda objekti viidete loendurit. Erinevalt weak viitest, eeldab unowned viide alati, et see osutab olemasolevale eksemplarile; kui viidatud eksemplar vabastatakse, põhjustab sellele juurdepääs viga jooksuaegses veas. Seda kasutatakse, kui seotud objekti elutsükkel on kas sama või pikem kui objekti, milles on unowned viide.
Näide kasutamisest:
class Department {
var name: String
var courses: [Course] = []
init(name: String) {
self.name = name
print("\(name) osakond alustab initsialiseerimist")
}
deinit {
print("\(name) osakond lõpetab")
}
}
class Course {
var name: String
unowned var department: Department // Unowned viide
init(name: String, department: Department) {
self.name = name
self.department = department
print("\(name) kursus alustab initsialiseerimist")
}
deinit {
print("\(name) kursus lõpetab")
}
}
var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)
accounting!.courses.append(introToAccounting!)
accounting = nil // Nüüd võib `Department` objekt vabastada
introToAccounting = nil // Nüüd võib `Course` objekti vabastada
Selles näites on Course-il unowned viide Department-ile. Kuna Course ei saa eksisteerida ilma Department-ita (loogiliselt), ja Department haldab Course elutsüklit courses massiivi kaudu, on unowned siin sobiv. See takistab tugevaid tsüklilisi viiteid accounting ja introToAccounting vahel. Kui accounting muutub nil, vabastatakse Department-i objekt ning seejärel ka Course-i objekt, kuna sellele ei jää tugevaid viiteid.