Sobes.tech
Middle

Que ligações existem no objeto sitetable?

sobes.tech IA

Resposta da IA

Fortes (strong), fracas (weak), sem proprietário (unowned).

  • Fort: Cria a posse do objeto, impedindo sua desalocação enquanto existirem referências fortes.
  • Fraco: Não cria posse. Se o objeto ao qual a referência fraca se refere for desalocado, a referência fraca torna-se automaticamente nil. Usado para prevenir ciclos de referências fortes, frequentemente para referências ao objeto pai ou delegado.
  • Sem proprietário: Não cria posse. Semelhante à referência fraca, mas garante que o objeto ao qual se refere existirá durante todo o ciclo de vida sem proprietário. Se tentar acessar o objeto após sua desalocação, ocorrerá um erro de execução (crash). Usado quando os objetos têm ciclos de vida semelhantes ou relacionados, e nil é aceitável, mas não esperado.
// Exemplo de 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 // Cria um ciclo de referências fortes

parent = nil // Parent não será desalocado devido à referência forte de child
child = nil // Child não será desalocado devido à referência forte de parent

// Exemplo de Weak
class ParentWeak {
    var child: ChildWeak?
}

class ChildWeak {
    weak var parent: ParentWeak? // Referência fraca

    deinit {
        print("ChildWeak desalocado")
    }
}

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

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

parentWeak = nil // ParentWeak desalocado
// ChildWeak desalocado

// Exemplo de Unowned
class ParentUnowned {
    var child: ChildUnowned?
}

class ChildUnowned {
    unowned var parent: ParentUnowned // Referência sem proprietário

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

    deinit {
        print("ChildUnowned desalocado")
    }
}

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

parentUnowned?.child = childUnowned

parentUnowned = nil // ParentUnowned desalocado, ChildUnowned desalocado