Sobes.tech
Middle

Kokie nuorodai yra sitetable objekte?

sobes.tech AI

Atsakymas iš AI

Stiprus (strong), silpnas (weak), be savininko (unowned).

  • Stiprus: Sukuria nuosavybę objektu, užkertant kelią jo deallokacijai, kol yra stiprios nuorodos.
  • Silpnas: Nesukuria nuosavybės. Jei objektas, į kurį nukreipia silpna nuoroda, deallokuojamas, silpna nuoroda automatiškai tampa nil. Naudojama siekiant išvengti stiprių nuorodų ciklų, dažnai nuorodoms į tėvinį objektą arba delegatą.
  • Be savininko: Nesukuria nuosavybės. Panaši į silpną nuorodą, bet užtikrina, kad į objektą, į kurį nukreipia, jis egzistuos viso gyvavimo ciklo metu be savininko nuorodos. Jei bandysite pasiekti objektą po jo deallokacijos, įvyks klaida (crash). Naudojama, kai objektai turi tą patį arba susijusį gyvavimo ciklą, ir nil yra leidžiama, bet ne tikimasi.
// Pavyzdys stiprus
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

var parent: Parent? = Parent()
var child: Child? = Child()

parent?.child = child
child?.parent = parent // Sukuria stiprių nuorodų ciklą

parent = nil // Parent nebus deallokuotas dėl stiprios nuorodos iš child
child = nil // Child nebus deallokuotas dėl stiprios nuorodos iš parent

// Pavyzdys silpnas
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Silpna nuoroda

    deinit {
        print("ChildWeak deallocated")
    }
}

var parentWeak: ParentWeak? = ParentWeak()
var childWeak: ChildWeak? = ChildWeak()

parentWeak?.child = childWeak
childWeak?.parent = parentWeak

parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated

// Pavyzdys be savininko
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Be savininko nuoroda

    init(parent: ParentUnowned) {
        self.parent = parent
    }

    deinit {
        print("ChildUnowned deallocated")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned turi egzistuoti

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated