Junior — Middle
Qual é a diferença entre referências Weak e Unowned na gestão de memória?
sobes.tech IA
Resposta da IA
Em Swift, as referências do tipo weak e unowned são usadas para evitar ciclos de referências fortes (ciclos de retenção) na gestão de memória, mas diferem em comportamento e aplicação.
-
Weak (referência fraca):
- Pode ser
nil. - Declarada como um tipo opcional (
var delegate: SomeDelegate? weak). - Usada quando a referência pode tornar-se
nildurante a vida do objeto, por exemplo, delegados. - O sistema automaticamente define a referência
weakcomonilquando o objeto referenciado é libertado.
- Pode ser
-
Unowned (sem proprietário):
- Não pode ser
nil(tipo não opcional). - Usada quando a referência existe garantidamente durante a vida do objeto, por exemplo, entre um pai e um filho.
- Se o objeto referenciado por
unownedjá tiver sido libertado, uma tentativa de acesso causará um erro em tempo de execução (crash).
- Não pode ser
Exemplo:
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Aqui, `tenant` é `unowned`, pois um apartamento não pode existir sem um inquilino.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// O delegado é `weak`, pois pode ser libertado antes.
Assim, weak é adequado para referências que podem tornar-se nil, e unowned para referências que devem estar sempre válidas durante a vida do objeto.