Sobes.tech
Middle

Quali collegamenti ci sono nell'oggetto sitetable?

sobes.tech AI

Risposta dell'AI

Forti (strong), deboli (weak), senza proprietà (unowned).

  • Forti: Crea il possesso dell'oggetto, impedendo la sua deallocazione finché ci sono riferimenti forti.
  • Deboli: Non crea possesso. Se l'oggetto a cui si riferisce il riferimento debole viene deallocato, il riferimento debole diventa automaticamente nil. Usato per prevenire cicli di riferimenti forti, spesso per riferimenti all'oggetto genitore o delegato.
  • Senza proprietà: Non crea possesso. Simile al riferimento debole, ma garantisce che l'oggetto a cui si riferisce esisterà durante tutto il ciclo di vita senza possesso. Se si tenta di accedere all'oggetto dopo la sua deallocazione, si verificherà un errore di runtime (crash). Usato quando gli oggetti hanno un ciclo di vita simile o collegato, e nil è accettabile ma non previsto.
// Esempio di Strong
class Parent {
    var child: Child?
}

class Child {
    var parent: Parent?
}

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

parent?.child = child
child?.parent = parent // Crea un ciclo di riferimenti forti

parent = nil // Parent non sarà deallocato a causa del riferimento forte da parte di child
child = nil // Child non sarà deallocato a causa del riferimento forte da parte di parent

// Esempio di Weak
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Riferimento debole

    deinit {
        print("ChildWeak deallocato")
    }
}

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

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

parentWeak = nil // ParentWeak deallocato
// ChildWeak deallocato

// Esempio di Unowned
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Riferimento senza proprietà

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

    deinit {
        print("ChildUnowned deallocato")
    }
}

var parentUnowned: ParentUnowned? = ParentUnowned()
var childUnowned: ChildUnowned? = ChildUnowned(parent: parentUnowned!) // ParentUnowned deve esistere

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned deallocato, ChildUnowned deallocato