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