Qu'est-ce que unowned dans le contexte de Swift?
sobes.tech IA
Réponse de l'IA
Unowned fait référence à la gestion automatique de la mémoire en Swift (ARC). Les références unowned sont utilisées pour éviter les cycles de références fortes lorsque deux objets se réfèrent mutuellement. Une référence unowned ne augmente pas le compteur de références de l'objet. Contrairement à une référence weak, une référence unowned est toujours censée pointer vers une instance existante ; si l'instance pointée par la référence unowned est libérée, toute tentative d'y accéder entraînera une erreur d'exécution. Elle est utilisée lorsque le cycle de vie de l'objet lié correspond ou dépasse celui de l'objet contenant la référence unowned.
Exemple d'utilisation :
class Department {
var name: String
var courses: [Course] = []
init(name: String) {
self.name = name
print("\(name) department is being initialized")
}
deinit {
print("\(name) department is being deinitialized")
}
}
class Course {
var name: String
unowned var department: Department // Référence faible non optionnelle
init(name: String, department: Department) {
self.name = name
self.department = department
print("\(name) course is being initialized")
}
deinit {
print("\(name) course is being deinitialized")
}
}
var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)
accounting!.courses.append(introToAccounting!)
accounting = nil // Maintenant, l'objet Department peut être libéré
introToAccounting = nil // Maintenant, l'objet Course peut être libéré
Dans cet exemple, Course a une référence unowned à Department. Étant donné que Course ne peut pas exister sans Department (logiquement), et que Department gère le cycle de vie de Course via le tableau courses, l'utilisation de unowned ici est appropriée. Cela empêche un cycle fort de références entre accounting et introToAccounting. Lorsque accounting devient nil, l'objet Department est libéré, puis l'objet Course est également libéré, car il n'y a plus de références fortes à lui.