Junior — Middle
Kuo skiriasi Weak ir Unowned nuorodos atminties valdyme?
sobes.tech AI
Atsakymas iš AI
Swift'e weak ir unowned tipų nuorodos naudojamos siekiant išvengti stiprių nuorodų ciklų (retain cycles) atminties valdyme, tačiau jos skiriasi savo elgesiu ir taikymu.
-
Weak (silpna nuoroda):
- Gali būti
nil. - Deklaruojama kaip pasirinktinio tipo (
var delegate: SomeDelegate? weak). - Naudojama, kai nuoroda gali tapti
nilper objekto gyvavimo laiką, pvz., delegatai. - Sistema automatiškai nustato
weaknuorodą įnil, kai referencijuojamas objektas yra atlaisvinamas.
- Gali būti
-
Unowned (be savininko):
- Negali būti
nil(nepasirinktinio tipo). - Naudojama, kai nuoroda garantuotai egzistuoja objekto gyvavimo metu, pvz., tėvo ir vaiko santykiuose.
- Jei referencijuojamas objektas jau yra atlaisvintas, bandymas prieiti prie jo sukels klaidą vykdymo metu (crash).
- Negali būti
Pavyzdys:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Čia, tenant yra unowned, nes butas negali egzistuoti be nuomininko.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegatas yra weak, nes jis gali būti anksčiau atlaisvintas.
Taigi, weak tinka nuorodoms, kurios gali tapti nil, o unowned – nuorodoms, kurios visada turi būti galiojančios objekto gyvavimo metu.