Sobes.tech
Middle

Mis on unowned Swift kontekstis?

sobes.tech AI

Vastus AI-lt

Unowned viitab Swifti automaatsele mäluhaldu (ARC) kontekstis. Unowned viited kasutatakse tugevate viidete tsüklite vältimiseks, kui kaks objekti viitavad üksteisele tugevalt. Unowned viide ei suurenda objekti viidete loendurit. Erinevalt weak viitest, eeldab unowned viide alati, et see osutab olemasolevale eksemplarile; kui viidatud eksemplar vabastatakse, põhjustab sellele juurdepääs viga jooksuaegses veas. Seda kasutatakse, kui seotud objekti elutsükkel on kas sama või pikem kui objekti, milles on unowned viide.

Näide kasutamisest:

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

    init(name: String) {
        self.name = name
        print("\(name) osakond alustab initsialiseerimist")
    }

    deinit {
        print("\(name) osakond lõpetab")
    }
}

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

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kursus alustab initsialiseerimist")
    }

    deinit {
        print("\(name) kursus lõpetab")
    }
}

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

accounting!.courses.append(introToAccounting!)

accounting = nil // Nüüd võib `Department` objekt vabastada
introToAccounting = nil // Nüüd võib `Course` objekti vabastada

Selles näites on Course-il unowned viide Department-ile. Kuna Course ei saa eksisteerida ilma Department-ita (loogiliselt), ja Department haldab Course elutsüklit courses massiivi kaudu, on unowned siin sobiv. See takistab tugevaid tsüklilisi viiteid accounting ja introToAccounting vahel. Kui accounting muutub nil, vabastatakse Department-i objekt ning seejärel ka Course-i objekt, kuna sellele ei jää tugevaid viiteid.