Sobes.tech
Middle

Mi az az unowned a Swift kontextusában?

sobes.tech MI

Válasz az MI-től

Unowned Swiftben az automatikus memória kezelésre (ARC) utal. Az unowned referenciák használata megakadályozza az erős hivatkozási ciklusokat, amikor két objektum kölcsönösen hivatkozik egymásra. Az unowned referencia nem növeli az objektum hivatkozási számlálóját. Ellentétben a weak referenciával, az unowned referencia mindig arra az példányra vár, hogy létezik; ha az általa hivatkozott példány felszabadul, a hozzáférési kísérlet futási időben hibát eredményez. Akkor használatos, amikor a kapcsolódó objektum életciklusa megegyezik vagy hosszabb, mint a unowned hivatkozást tartalmazó objektumé.

Használati példa:

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

    init(name: String) {
        self.name = name
        print("\(name) osztály inicializálva")
    }

    deinit {
        print("\(name) osztály deinitializálva")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned gyenge referencia

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kurzus inicializálva")
    }

    deinit {
        print("\(name) kurzus deinitializálva")
    }
}

var accounting: Department? = Department(name: "Számvitel")
var introToAccounting: Course? = Course(name: "Bevezetés a számvitelbe", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Most a Department objektum felszabadítható
introToAccounting = nil // Most a Course objektum felszabadítható

Ebben a példában a Course rendelkezik egy unowned referenciával a Department-re. Mivel a Course nem létezhet Department nélkül (logikusan), és a Department kezeli a Course életciklusát a courses tömbön keresztül, az unowned használata itt megfelelő. Ez megakadályozza az erős hivatkozási ciklust a accounting és az introToAccounting között. Amikor a accounting nil lesz, a Department objektum felszabadul, majd a Course objektum is, mivel már nincs rá erős hivatkozás.