Junior — Middle
Как се освобождава паметта за обекти с циклични връзки в управлявани среди?
sobes.tech AI
Отговор от AI
В управляеми среди като iOS с ARC (Автоматично броене на референции), освобождаването на памет за обекти с циклични препратки не се случва автоматично, тъй като ARC не може да прекъсне цикли от препратки.
За решаване на този проблем се използват слаби (weak) и безвладетелски (unowned) препратки, които не увеличават брояча на препратките на обекта. Това позволява да се прекъснат циклите и правилно да се освободи паметта.
Пример:
class Person {
var name: String
weak var apartment: Apartment? // слаба препратка
init(name: String) {
self.name = name
}
}
class Apartment {
let unit: String
unowned let tenant: Person // безвладетелска препратка
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
}
}
Тук Person и Apartment се позовават взаимно, но една от препратките е слаба, което предотвратява течове на памет.
Ако циклите от препратки не бъдат прекъснати, обектите ще останат в паметта въпреки липсата на външни препратки, което ще доведе до течове на памет.