Sobes.tech
Middle

Co znamená unowned v kontextu Swift?

sobes.tech AI

Odpověď od AI

Unowned odkazuje na automatické řízení paměti v Swift (ARC). Unowned odkazy se používají k prevenci cyklů silných odkazů, když si dva objekty navzájem odkazují. Unowned odkaz nezvyšuje počítadlo odkazů objektu. Na rozdíl od weak odkazu se odhadává, že unowned odkaz vždy ukazuje na existující instanci; pokud instance, na kterou odkazuje unowned odkaz, je uvolněna, pokus o přístup k ní způsobí chybu za běhu. Používá se, když životní cyklus souvisejícího objektu odpovídá nebo je delší než životní cyklus objektu obsahujícího odkaz unowned.

Příklad použití:

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

    init(name: String) {
        self.name = name
        print("\(name) oddělení je inicializováno")
    }

    deinit {
        print("\(name) oddělení je deinitializováno")
    }
}

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 je inicializován")
    }

    deinit {
        print("\(name) kurz je deinitializován")
    }
}

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

accounting!.courses.append(introToAccounting!)

accounting = nil // Nyní může být objekt Department uvolněn
introToAccounting = nil // Nyní může být objekt Course uvolněn

V tomto příkladu má Course odkaz unowned na Department. Protože Course nemůže existovat bez Department (logicky), a Department řídí životní cyklus Course přes pole courses, je použití unowned zde vhodné. Tím se zabrání silnému cyklu odkazů mezi accounting a introToAccounting. Když accounting bude nastaven na nil, objekt Department bude uvolněn, a následně i objekt Course, protože na něj již neexistují žádné silné odkazy.