Junior — Middle
Wat is het verschil tussen Weak en Unowned referenties in geheugenbeheer?
sobes.tech AI
Antwoord van AI
In Swift worden referenties van het type weak en unowned gebruikt om sterke referentiecirkels (retentiecycli) bij geheugenbeheer te voorkomen, maar verschillen in gedrag en toepassing.
-
Weak (zwakke referentie):
- Kan
nilzijn. - Wordt gedeclareerd als een optioneel type (
var delegate: SomeDelegate? weak). - Wordt gebruikt wanneer de referentie gedurende de levensduur van het object
nilkan worden, bijvoorbeeld bij delegates. - Het systeem zet de
weakreferentie automatisch opnilwanneer het referentie-object wordt vrijgegeven.
- Kan
-
Unowned (zonder eigenaar):
- Kan niet
nilzijn (niet optioneel). - Wordt gebruikt wanneer de referentie gegarandeerd bestaat tijdens de levensduur van het object, bijvoorbeeld tussen een ouder en een kind.
- Als het referentie-object al is vrijgegeven, leidt een poging tot toegang tot een runtime-fout (crash).
- Kan niet
Voorbeeld:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Hier is `tenant` unowned, omdat een appartement niet zonder huurder kan bestaan.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// De delegate is `weak`, omdat deze eerder kan worden vrijgegeven.
Dus, weak is geschikt voor referenties die nil kunnen worden, en unowned voor referenties die altijd geldig moeten zijn tijdens de levensduur van het object.