Sobes.tech
Junior

Kuo skiriasi silpni ir stiprūs nuorodos?

sobes.tech AI

Atsakymas iš AI

Skirtumas atminties valdymo mechanizme (ARC - Automatinis nuorodų skaičiavimas):

  • Stipri nuoroda (Strong reference): padidina objekto nuorodų skaičių 1-ąją. Objektas negali būti išlaisvintas iš atminties, kol jis turi bent vieną stiprią nuorodą. Tai yra numatytasis elgesys Swift savybėms ir kintamiesiems:

  • Silpna nuoroda (Weak reference): nepadidina objekto nuorodų skaičiaus. Naudojama ciklinių nuorodų išvengimui, kai du ar daugiau objektų turi stiprias nuorodas vienas į kitą, sukurdami atminties nutekėjimą. Silpnos nuorodos visada yra opcioninės (Optional), nes nuoroda į objektą gali būti bet kada panaikinta. Jei objektas panaikinamas, silpna nuoroda automatiškai tampa nil:

Ciklinių nuorodų išvengimo pavyzdys naudojant silpną nuorodą:

class Person {
    let name: String
    var apartment: Apartment? // pradžioje stipri nuoroda
    init(name: String) { self.name = name }
    deinit { print("\(name) išlaisvintas") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // silpna nuoroda
    init(unit: String) { self.unit = unit }
    deinit { print("Butas \(unit) išlaisvintas") }
}

var john: Person? // Person objektas
var unit4A: Apartment? // Apartment objektas

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Ciklinės nuorodos sukūrimas:
// john turi stiprią nuorodą į butą
// butas turi stiprią nuorodą į žmogų
john!.apartment = unit4A
unit4A!.tenant = john // tai turi būti silpna nuoroda, kad būtų išvengta ciklo

john = nil // nustatant john į nil, jis nebus išlaisvintas, jei yra ciklas
unit4A = nil // tas pats, jei yra ciklas, jis nebus išlaisvintas

// Tikėtinas rezultatas:
// John Appleseed išlaisvintas
// Butas 4A išlaisvintas

Jei weak nebūtų naudojama tenant, deinit funkcijos nebūtų iškviečiamos, kas rodo atminties nutekėjimą.