Sobes.tech
Middle

Kas reiškia unowned Swift kontekste?

sobes.tech AI

Atsakymas iš AI

Unowned yra susijęs su automatinio atminties valdymo Swift (ARC). Unowned nuorodos naudojamos siekiant išvengti stiprių nuorodų ciklų, kai du objektai stipriai nurodo vienas kitą. Unowned nuoroda nesuteikia objekto nuorodų skaitiklio padidinimo. Skirtingai nuo weak nuorodos, unowned nuoroda visada tikimasi nurodyti į esamą egzempliorių; jei nurodytas egzempliorius yra išlaisvinamas, bandymas prie jo prieiti sukels vykdymo klaidą. Naudojama, kai susijęs objekto gyvavimo ciklas yra arba sutampa, arba ilgesnis už objekto, kuriame yra unowned nuoroda.

Naudojimo pavyzdys:

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

    init(name: String) {
        self.name = name
        print("\(name) departamentas pradeda inicializaciją")
    }

    deinit {
        print("\(name) departamentas yra išlaisvinamas")
    }
}

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

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kursas pradeda inicializaciją")
    }

    deinit {
        print("\(name) kursas yra išlaisvinamas")
    }
}

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

accounting!.courses.append(introToAccounting!)

accounting = nil // Dabar `Department` objektas gali būti išlaisvintas
introToAccounting = nil // Dabar `Course` objektas gali būti išlaisvintas

Šiame pavyzdyje Course turi unowned nuorodą į Department. Kadangi Course negali egzistuoti be Department (loginė prasme), ir Department valdo Course gyvavimo ciklą per courses masyvą, unowned čia yra tinkamas. Tai išvengia stiprių ciklinių nuorodų tarp accounting ir introToAccounting. Kai accounting tampa nil, Department objektas yra išlaisvinamas, o po to ir Course objektas, nes nėra stiprių nuorodų į jį.