Sobes.tech
Middle

Kādi saites ir sitetable objektā?

sobes.tech AI

Atbilde no AI

Spēcīgas (strong), vājas (weak), bez īpašnieka (unowned).

  • Spēcīga: Izveido īpašumu objektam, novēršot tā deallokāciju, kamēr ir spēcīgas atsauces.
  • Vāja: Neizveido īpašumu. Ja objekts, uz kuru atsaucas vāja atsauce, tiek deallokēts, vāja atsauce automātiski kļūst par nil. To izmanto, lai novērstu spēcīgu atsauču ciklus, bieži uz vecāka objekta vai deleģenta atsaucēm.
  • Bez īpašnieka: Neizveido īpašumu. Līdzīgs vājam atsaucei, bet garantē, ka objekts, uz kuru atsaucas, pastāvēs visu dzīves cikla laikā bez īpašnieka atsauces. Ja mēģināsiet piekļūt objektam pēc tā deallokācijas, notiks kļūda (crash). To izmanto, ja objektiem ir vienāds vai saistīts dzīves cikls, un nil ir atļauts, bet negaidīts.
// Piemērs Spēcīgs
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Izveido spēcīgu atsauču ciklu

parent = nil // Parent netiks deallokēts, jo ir spēcīga atsauce no child
child = nil // Child netiks deallokēts, jo ir spēcīga atsauce no parent

// Piemērs Vājš
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Vāja atsauce

    deinit {
        print("ChildWeak deallocated")
    }
}

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

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

parentWeak = nil // ParentWeak deallocated
// ChildWeak deallocated

// Piemērs Bez īpašnieka
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Bez īpašnieka atsauce

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

    deinit {
        print("ChildUnowned deallocated")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned ir jāpastāv

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned deallocated, ChildUnowned deallocated