Sobes.tech
Middle

Čo znamená unowned v kontexte Swift?

sobes.tech AI

Odpoveď od AI

Unowned odkazuje na automatické riadenie pamäte v Swift (ARC). Unowned odkazov sa používajú na prevenciu cyklov silných odkazov, keď si dva objektu navzájom odkazujú. Unowned odkaz nezvyšuje počet odkazov na objekt. Na rozdiel od weak odkazov, sa odhaduje, že unowned odkaz vždy ukazuje na existujúci inštanciu; ak inštancia, na ktorú odkazuje unowned odkaz, bude uvoľnená, pokus o prístup k nej spôsobí chybu za behu. Používa sa, keď životný cyklus súvisiaceho objektu zodpovedá alebo je dlhší ako životný cyklus objektu, ktorý obsahuje unowned odkaz.

Príklad použitia:

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

    init(name: String) {
        self.name = name
        print("\(name) oddelenie sa inicializuje")
    }

    deinit {
        print("\(name) oddelenie sa deinitializuje")
    }
}

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

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kurz sa inicializuje")
    }

    deinit {
        print("\(name) kurz sa deinitializuje")
    }
}

var accounting: Department? = Department(name: "Účtovníctvo")
var introToAccounting: Course? = Course(name: "Úvod do účtovníctva", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Teraz môže byť objekt Department uvoľnený
introToAccounting = nil // Teraz môže byť objekt Course uvoľnený

V tomto príklade má Course odkaz unowned na Department. Pretože Course nemôže existovať bez Department (logicky), a Department riadi životný cyklus Course cez pole courses, použitie unownedje vhodné. Týmto sa zabráni silnému cyklu odkazov medziaccountingaintroToAccounting. Keď accountingbude nastavené nanil, objekt Departmentbude uvoľnený, a následne aj objektCourse`, pretože na neho už nie sú žiadne silné odkazy.