Sobes.tech
Middle

Milyen linkek vannak a sitetable objektumban?

sobes.tech MI

Válasz az MI-től

Erős (strong), gyenge (weak), tulajdon nélküli (unowned).

  • Erős: Létrehozza az objektum tulajdonjogát, és megakadályozza annak deallokálását, amíg erős hivatkozások léteznek.
  • Gyenge: Nem hoz létre tulajdonjogot. Ha a gyenge hivatkozás által hivatkozott objektum deallocálódik, a gyenge hivatkozás automatikusan nil lesz. Gyakran használják erős hivatkozási ciklusok elkerülésére, például szülő vagy delegált hivatkozásoknál.
  • Tulajdon nélküli: Nem hoz létre tulajdonjogot. Hasonló a gyenge hivatkozáshoz, de garantálja, hogy a hivatkozott objektum az egész életciklusa alatt létezik tulajdon nélkül. Ha a deallocálás után próbál hozzáférni az objektumhoz, futási hiba (crash) lép fel. Akkor használják, ha az objektumok hasonló vagy összefüggő életciklussal rendelkeznek, és a nil elfogadható, de nem elvárt.
// Erős példa
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Erős hivatkozási ciklus létrehozása

parent = nil // A szülő nem lesz deallocálva a child erős hivatkozása miatt
child = nil // A gyermek nem lesz deallocálva a szülő erős hivatkozása miatt

// Gyenge példa
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Gyenge hivatkozás

    deinit {
        print("ChildWeak deallocálva")
    }
}

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

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

parentWeak = nil // A szülő deallocálódik
// A gyermek deallocálódik

// Tulajdon nélküli példa
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Tulajdon nélküli hivatkozás

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

    deinit {
        print("ChildUnowned deallocálva")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // A ParentUnowned léteznie kell

parentUnowned?.child = childUnowned

parentUnowned = nil // A ParentUnowned és a ChildUnowned deallocálódik