Sobes.tech
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í weak odkaz na nil, když je referencovaný objekt uvolněn.
  • 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).

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.