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 tampanil:
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ą.