In welke gevallen is het beter om unowned te gebruiken in plaats van weak bij geheugenbeheer?
sobes.tech AI
Antwoord van AI
In Swift worden weak en unowned gebruikt om sterke referentiecirkels te voorkomen, maar ze worden in verschillende situaties toegepast:
-
weakis een optionele referentie die automatischnilwordt wanneer het object waarnaar wordt verwezen wordt vrijgegeven. Het wordt gebruikt wanneer de referentie tijdens de levensduur van het objectnilkan worden. -
unownedis een niet-optionele referentie die ervan uitgaat dat het verwezen object altijd zal bestaan tijdens het gebruik van deze referentie. Als het object wordt vrijgegeven, zal toegang totunownedeen runtime-fout veroorzaken.
Het wordt aanbevolen om unowned te gebruiken wanneer:
- De referentie altijd naar een bestaand object moet wijzen (bijvoorbeeld een ouderobject dat langer leeft dan het kind).
- Je zeker weet dat de levensduur van het verwezen object niet korter zal zijn dan die van de referentie.
Voorbeeld:
class Customer {
let name: String
var card: CreditCard?
init(name: String) {
self.name = name
}
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
}
let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)
Hier heeft CreditCard een unowned-referentie naar Customer, omdat de kaart niet zonder de klant kan bestaan, en de klant langer leeft dan de kaart.