Wat is het verschil tussen zwakke en sterke links?
sobes.tech AI
Antwoord van AI
Het verschil in het geheugenbeheermechanisme (ARC - Automatische Referentie Telling).
-
Sterke referentie (Strong reference): Verhoogt de referentieteller van het object met 1. Het object kan niet worden vrijgegeven uit het geheugen zolang er ten minste één sterke referentie naar is. Dit gedrag is standaard voor eigenschappen en variabelen in Swift.
-
Zwakke referentie (Weak reference): Verhoogt de referentieteller van het object niet. Wordt gebruikt om cyclische referenties te voorkomen, wanneer twee of meer objecten sterke referenties naar elkaar hebben, wat leidt tot geheugenlekken. Zwakke referenties zijn altijd optioneel (
Optional), omdat het object waarnaar ze verwijzen op elk moment kan worden gedealloceerd. Als het object wordt vrijgegeven, wordt de zwakke referentie automatischnil.
Voorbeeld van een cyclische referentie en het voorkomen ervan met een zwakke referentie:
class Person {
let name: String
var apartment: Apartment? // Initiële sterke referentie
init(name: String) { self.name = name }
deinit { print("\(name) wordt gedeinitialiseerd") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Zwakke referentie
init(unit: String) { self.unit = unit }
deinit { print("Appartement \(unit) wordt gedeinitialiseerd") }
}
var john: Person? // Person instantie
var unit4A: Apartment? // Apartment instantie
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Creëren van een cyclische sterke referentie:
// john heeft een sterke referentie naar het appartement
// appartement heeft een sterke referentie naar de persoon
john!.apartment = unit4A
unit4A!.tenant = john // Dit moet zwak zijn om de cyclus te breken
john = nil // Het instellen op nil zal het niet dealloceren als de cyclus bestaat
unit4A = nil // Het instellen op nil zal het niet dealloceren als de cyclus bestaat
// Verwachte output bij gebruik van zwakke referentie voor huurder:
// John Appleseed wordt gedeinitialiseerd
// Appartement 4A wordt gedeinitialiseerd
Zonder weak voor tenant, zouden destructors niet worden aangeroepen, wat wijst op een geheugenlek.