Sobes.tech
Middle

Ce înseamnă unowned în contextul Swift?

sobes.tech AI

Răspuns de la AI

Unowned se referă la gestionarea automată a memoriei în Swift (ARC). Referințele unowned sunt utilizate pentru a preveni ciclurile de referințe puternice atunci când două obiecte se referă reciproc. O referință unowned nu crește contorul de referințe al obiectului. Spre deosebire de o referință weak, o referință unowned se așteaptă întotdeauna să indice către o instanță existentă; dacă instanța la care face referire referința unowned este eliberată, încercarea de a o accesa va duce la o eroare în timpul execuției. Este utilizată atunci când ciclul de viață al obiectului asociat coincide sau este mai lung decât ciclul de viață al obiectului care conține referința unowned.

Exemplu de utilizare:

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

    init(name: String) {
        self.name = name
        print("\(name) departament este inițializat")
    }

    deinit {
        print("\(name) departament este dezinitalizat")
    }
}

class Course {
    var name: String
    unowned var department: Department // Referință unowned

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) curs este inițializat")
    }

    deinit {
        print("\(name) curs este dezinitalizat")
    }
}

var accounting: Department? = Department(name: "Contabilitate")
var introToAccounting: Course? = Course(name: "Introducere în contabilitate", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Acum obiectul Department poate fi eliberat
introToAccounting = nil // Acum obiectul Course poate fi eliberat

În acest exemplu, Course are o referință unowned către Department. Deoarece Course nu poate exista fără Department (din punct de vedere logic), și Department gestionează ciclul de viață al Course prin array-ul courses, utilizarea unowned aici este adecvată. Acest lucru previne un ciclu de referințe puternice între accounting și introToAccounting. Când accounting devine nil, obiectul Department este eliberat, iar apoi și obiectul Course, deoarece nu mai există referințe puternice către el.