Sobes.tech
Middle

Какво означава unowned в контекста на Swift?

sobes.tech AI

Отговор от AI

Unowned се отнася до автоматично управление на паметта в Swift (ARC). Unowned препратките се използват за предотвратяване на цикли от силни препратки, когато два обекта се позовават взаимно. Unowned препратката не увеличава брояча на препратките на обекта. За разлика от weak препратката, unowned препратката винаги се очаква да сочи към съществуващ екземпляр; ако екземплярът, към който сочи unowned препратката, бъде освободен, опитът за достъп до него ще доведе до грешка по време на изпълнение. Използва се, когато жизненият цикъл на свързания обект съвпада или е по-дълъг от жизнения цикъл на обекта, който съдържа unowned препратката.

Пример за използване:

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

    init(name: String) {
        self.name = name
        print("\(name) отдел започва")
    }

    deinit {
        print("\(name) отдел приключва")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned препратка

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) курс започва")
    }

    deinit {
        print("\(name) курс приключва")
    }
}

var accounting: Department? = Department(name: "Счетоводство")
var introToAccounting: Course? = Course(name: "Въведение в счетоводството", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Сега обектът Department може да бъде освободен
introToAccounting = nil // Сега обектът Course може да бъде освободен

В този пример, Course има unowned препратка към Department. Тъй като Course не може да съществува без Department (логически), и Department управлява жизнения цикъл на Course чрез масива courses, използването на unowned тук е подходящо. Това предотвратява силен цикъл от препратки между accounting и introToAccounting. Когато accounting стане nil, обектът Department се освобождава, а след това и обектът Course, тъй като няма повече силни препратки към него.