Sobes.tech
Junior

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 automatikusan nil lesz.

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.