Junior
Kas yra weak atminties modifikatorius Swift?
sobes.tech AI
Atsakymas iš AI
weak modifikatorius naudojamas nutraukti stiprių nuorodų ciklus (reference cycles) tarp objektų, kai vienas objektas turi stiprią nuorodą į kitą, o tas grįžta su stipriąja nuoroda.
Pagrindinės weak savybės:
- Nekelia nuorodų skaičiaus: Naudojant
weak, nesikeičia stiprių nuorodų skaičius į objektą. - Gali būti
nil: Silpna nuoroda yra pasirenkama (Optional) ir automatiškai tampanil, kai objektas, į kurį ji nurodo, yra deinitializuojamas. - Naudojama tėvo/vaiko santykiams: Dažnai taikoma, kai vaiko objektas turi nuorodą į savo tėvą, siekiant išvengti stiprių nuorodų ciklo.
- Reikalauja deklaruoti kaip
var: Kadangi silpna nuoroda gali taptinil, ji turi būti kintama (var), o ne konstanta (let).
Pavyzdys:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) yra inicijuojamas")
}
deinit {
print("\(name) yra deinitializuojamas")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Silpna nuoroda
init(unit: String) {
self.unit = unit
print("Butas \(unit) yra inicijuojamas")
}
deinit {
print("Butas \(unit) yra deinitializuojamas")
}
}
Be weak var tenant: Person? Apartment klasėje būtų stiprių nuorodų ciklas, ir Person bei Apartment egzemplioriai nebūtų deinitializuojami, kai jų daugiau niekas nelaiko stipriomis nuorodomis. Dėl weak, kai Person egzempliorius deinitializuojamas, nuoroda tenant Apartment egzemplioriuje automatiškai tampa nil.