Junior — Middle
V čem se liší odkazy typu Weak a Unowned v řízení paměti?
sobes.tech AI
Odpověď od AI
Ve Swiftu se typy odkazů weak a unowned používají k prevenci silných referenčních cyklů (retain cycles) při správě paměti, ale liší se chováním a použitím.
-
Weak (slabý odkaz):
- Může být
nil. - Je deklarován jako volitelný typ (
var delegate: SomeDelegate? weak). - Používá se, když odkaz může během života objektu přejít na
nil, například u delegátů. - Systém automaticky nastaví
weakodkaz nanil, když je referencovaný objekt uvolněn.
- Může být
-
Unowned (bez vlastnictví):
- Nemůže být
nil(nevolitelný typ). - Používá se, když odkaz existuje garantovaně po celou dobu života objektu, například mezi rodičem a dítětem.
- Pokud je referencovaný objekt již uvolněn, pokus o přístup způsobí chybu za běhu (crash).
- Nemůže být
Příklad:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Zde je tenant unowned, protože byt nemůže existovat bez nájemce.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Delegát je weak, protože může být dříve uvolněn.
Tedy, weak je vhodný pro odkazy, které mohou být nil, a unowned pro odkazy, které musí být vždy platné po celou dobu života objektu.