Junior — Middle
Aký je rozdiel medzi odkazmi typu Weak a Unowned v správe pamäte?
sobes.tech AI
Odpoveď od AI
V Swift-e sa referencie typu weak a unowned používajú na prevenciu silných referenčných cyklov (retain cycles) pri správe pamäte, ale líšia sa v správaní a použití.
-
Weak (slabá referencia):
- Môže byť
nil. - Deklaruje sa ako voliteľný typ (
var delegate: SomeDelegate? weak). - Používa sa, keď referencia môže počas života objektu prejsť na
nil, napríklad u delegátov. - Systém automaticky nastaví
weakreferenciu nanil, keď referencovaný objekt bude uvoľnený.
- Môže byť
-
Unowned (bez vlastníka):
- Nemôže byť
nil(nevoliteľný typ). - Používa sa, keď referencia existuje garantovane počas celého života objektu, napríklad medzi rodičom a dieťaťom.
- Ak je referencovaný objekt už uvoľnený, pokus o prístup spôsobí chybu počas behu (crash).
- Nemôže byť
Príklad:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Tu je tenant unowned, pretože byt nemôže existovať bez nájomníka.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegát je weak, pretože môže byť uvoľnený skôr.
Preto je weak vhodný pre referencie, ktoré môžu byť nil, a unowned pre tie, ktoré musia byť vždy platné počas života objektu.