Sobes.tech
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í weak referenciu na nil, keď referencovaný objekt bude uvoľnený.
  • 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).

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.