Sobes.tech
Middle

Kas ir unowned Swift kontekstā?

sobes.tech AI

Atbilde no AI

Unowned ir saistīts ar Swift automātisko atmiņas pārvaldību (ARC). Unowned atsauces tiek izmantotas, lai novērstu stipru atsauces ciklus, kad divi objekti stipri atsaucas viens uz otru. Unowned atsauce nesamazina objekta atsauces skaitītāju. Atšķirībā no weak atsauces, unowned atsauce vienmēr tiek sagaidīta norādot uz esošu eksemplāru; ja objekts, uz kuru norāda unowned atsauce, tiek atbrīvots, piekļuve tam izraisīs izpildes kļūdu. To izmanto, kad saistītā objekta dzīves cikls ir vai nu sakrīt, vai ir ilgāks par objekta, kurā ir unowned atsauce, dzīves ciklu.

Piemērs lietošanai:

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

    init(name: String) {
        self.name = name
        print("\(name) nodaļa tiek inicializēta")
    }

    deinit {
        print("\(name) nodaļa tiek izbeigta")
    }
}

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

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kurss tiek inicializēts")
    }

    deinit {
        print("\(name) kurss tiek izbeigts")
    }
}

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

accounting!.courses.append(introToAccounting!)

accounting = nil // Tagad `Department` objekts var tikt izbeigts
introToAccounting = nil // Tagad `Course` objekts var tikt izbeigts

Šajā piemērā Course ir unowned atsauce uz Department. Tā kā Course nevar pastāvēt bez Department (loģiski), un Department pārvalda Course dzīves ciklu caur courses masīvu, unowned šeit ir piemērots. Tas novērš stipru ciklisku atsauču veidošanos starp accounting un introToAccounting. Kad accounting kļūst par nil, Department objekts tiek izbeigts, un pēc tam arī Course objekts, jo tam vairs nav stipru atsauču.