Sobes.tech
Junior — Middle

Каква е разликата между използването на ключовите думи 'unowned' и 'strong' при обявяване на препратки в Swift?

sobes.tech AI

Отговор от AI

В Swift ключовите думи strong и unowned се използват за управление на референциите и предотвратяване на цикли на задържане (retain cycles).

  • strong — това е стандартна силна референция, която увеличава брояча на референциите към обекта. Докато съществува поне една силна референция, обектът няма да бъде изтрит от паметта.

  • unowned — това е слаб, но не опционален референция. Тя не увеличава брояча на референциите, но предполага, че обектът, към който се отнася, винаги съществува по време на използването на тази референция. Ако обектът вече е изтрит, достъпът до unowned референцията ще доведе до грешка по време на изпълнение.

Пример:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

let john = Person()
let apt = Apartment(tenant: john)
john.apartment = apt

Тук tenant е обявен като unowned, защото апартаментът не трябва да държи човека с силна референция, за да избегне цикъл, но се предполага, че човекът съществува по-дълго от апартамента.