Junior — Middle
Quelle est la différence entre les références Weak et Unowned dans la gestion de la mémoire?
sobes.tech IA
Réponse de l'IA
En Swift, les références de type weak et unowned sont utilisées pour éviter les cycles de références fortes (cycles de rétention) lors de la gestion de la mémoire, mais diffèrent par leur comportement et leur utilisation.
-
Weak (référence faible) :
- Peut être
nil. - Déclarée comme un type optionnel (
var delegate: SomeDelegate? weak). - Utilisée lorsque la référence peut devenir
nilau cours de la vie de l'objet, par exemple, pour les délégués. - Le système met automatiquement la référence
weakànillorsque l'objet référencé est libéré.
- Peut être
-
Unowned (sans propriétaire) :
- Ne peut pas être
nil(type non optionnel). - Utilisée lorsque la référence existe de manière garantie pendant la vie de l'objet, par exemple, entre un parent et un enfant.
- Si l'objet référencé par
unownedest déjà libéré, une tentative d'accès entraînera une erreur à l'exécution (crash).
- Ne peut pas être
Exemple :
class Person {
var apartment: Apartment?
}
class Apartment {
unowned let tenant: Person
init(tenant: Person) {
self.tenant = tenant
}
}
// Ici, `tenant` est `unowned`, car un appartement ne peut pas exister sans un locataire.
class DelegateHolder {
weak var delegate: SomeDelegate?
}
// Le délégué est `weak`, car il peut être libéré plus tôt.
Ainsi, weak convient pour les références qui peuvent devenir nil, et unowned pour celles qui doivent toujours être valides pendant la vie de l'objet.