Sobes.tech
Middle

Cosa significa unowned nel contesto di Swift?

sobes.tech AI

Risposta dell'AI

Unowned si riferisce alla gestione automatica della memoria in Swift (ARC). Le referenze unowned vengono utilizzate per evitare cicli di riferimenti forti quando due oggetti si riferiscono reciprocamente. Una referenza unowned non aumenta il contatore di riferimenti dell'oggetto. A differenza di una referenza weak, una referenza unowned si aspetta sempre di puntare a un'istanza esistente; se l'istanza a cui si riferisce la referenza unowned viene liberata, il tentativo di accedervi causerà un errore in fase di esecuzione. Viene usata quando il ciclo di vita dell'oggetto correlato coincide o è più lungo di quello dell'oggetto che contiene la referenza unowned.

Esempio di utilizzo:

class Department {
    var name: String
    var courses: [Course] = []

    init(name: String) {
        self.name = name
        print("\(name) dipartimento viene inizializzato")
    }

    deinit {
        print("\(name) dipartimento viene deallocato")
    }
}

class Course {
    var name: String
    unowned var department: Department // Riferimento weak non opzionale

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) corso viene inizializzato")
    }

    deinit {
        print("\(name) corso viene deallocato")
    }
}

var accounting: Department? = Department(name: "Contabilità")
var introToAccounting: Course? = Course(name: "Introduzione alla contabilità", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Ora l'oggetto Department può essere liberato
introToAccounting = nil // Ora l'oggetto Course può essere liberato

In questo esempio, Course ha una referenza unowned a Department. Poiché Course non può esistere senza Department (logicamente), e Department gestisce il ciclo di vita di Course tramite l'array courses, l'uso di unowned qui è appropriato. Questo previene un ciclo di riferimenti forti tra accounting e introToAccounting. Quando accounting diventa nil, l'oggetto Department viene deallocato, e successivamente anche l'oggetto Course, poiché non ci sono più riferimenti forti ad esso.