Mi a különbség a gyenge és az erős linkek között?
sobes.tech MI
Válasz az MI-től
A memória kezelésének mechanizmusában (ARC - Automatikus Hivatkozásszámolás) különbség.
-
Erős hivatkozás (Strong reference): Növeli az objektum hivatkozásszámát 1-gyel. Az objektum nem szabadulhat fel a memóriából, amíg legalább egy erős hivatkozás létezik rá. Ez az alapértelmezett viselkedés Swift-ben a tulajdonságokra és változókra.
-
Gyenge hivatkozás (Weak reference): Nem növeli az objektum hivatkozásszámát. A ciklikus hivatkozások megelőzésére használják, amikor két vagy több objektum erős hivatkozásokat tart egymásra, memóriaszivárgást okozva. A gyenge hivatkozások mindig opcionálisak (
Optional), mert az általuk hivatkozott objektum bármikor felszabadulhat. Ha az objektum felszabadul, a gyenge hivatkozás automatikusannillesz.
Példa ciklikus hivatkozásra és annak megelőzésére gyenge hivatkozással:
class Person {
let name: String
var apartment: Apartment? // Kezdetben erős hivatkozás
init(name: String) { self.name = name }
deinit { print("\(name) felszabadul") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Gyenge hivatkozás
init(unit: String) { self.unit = unit }
deinit { print("Lakás \(unit) felszabadul") }
}
var john: Person? // Person példány
var unit4A: Apartment? // Apartment példány
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Erős hivatkozási ciklus létrehozása:
// john erős hivatkozást tart az apartmanra
// az apartman erős hivatkozást tart a személyre
john!.apartment = unit4A
unit4A!.tenant = john // Ez gyenge kell legyen a ciklus megszakításához
john = nil // A nil értékadás nem szabadítja fel, ha a ciklus létezik
unit4A = nil // A nil értékadás nem szabadítja fel, ha a ciklus létezik
// Várható kimenet gyenge hivatkozás használatakor a tenant esetében:
// John Appleseed felszabadul
// Lakás 4A felszabadul
Gyenge hivatkozás nélkül a tenant esetében, a destruktorok nem hívódnának meg, ami memória szivárgást jelez.