Sobes.tech
Middle

Wat betekent unowned in de context van Swift?

sobes.tech AI

Antwoord van AI

Unowned verwijst naar automatisch geheugenbeheer in Swift (ARC). Unowned referenties worden gebruikt om sterke referentiecycli te voorkomen wanneer twee objecten elkaar sterk verwijzen. Een unowned referentie verhoogt de referentieteller van het object niet. In tegenstelling tot een weak referentie, wordt van een unowned referentie altijd verwacht dat deze wijst naar een bestaande instantie; als de instantie waarnaar de unowned referentie wijst wordt vrijgegeven, leidt een poging tot toegang tot een runtime-fout. Het wordt gebruikt wanneer de levensduur van het gerelateerde object gelijk is aan of langer dan die van het object dat de unowned referentie bevat.

Voorbeeld van gebruik:

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

    init(name: String) {
        self.name = name
        print("\(name) afdeling wordt geïnitialiseerd")
    }

    deinit {
        print("\(name) afdeling wordt gedeinitialiseerd")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned zwakke referentie

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) cursus wordt geïnitialiseerd")
    }

    deinit {
        print("\(name) cursus wordt gedeinitialiseerd")
    }
}

var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Nu kan het Department-object worden vrijgegeven
introToAccounting = nil // Nu kan het Course-object worden vrijgegeven

In dit voorbeeld heeft Course een unowned verwijzing naar Department. Omdat Course niet zonder Department kan bestaan (logisch), en Department de levenscyclus van Course beheert via de array courses, is het gebruik van unowned hier passend. Dit voorkomt een sterke referentiecyclus tussen accounting en introToAccounting. Wanneer accounting op nil wordt gezet, wordt het Department-object vrijgegeven, en daarna wordt ook het Course-object vrijgegeven omdat er geen sterke verwijzingen meer naar zijn.