Каква е разликата между използването на ключовите думи '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, защото апартаментът не трябва да държи човека с силна референция, за да избегне цикъл, но се предполага, че човекът съществува по-дълго от апартамента.