Junior — Middle
Jak odbywa się zwalnianie pamięci dla obiektów z cyklicznymi referencjami w środowiskach zarządzanych?
sobes.tech AI
Odpowiedź od AI
W środowiskach zarządzanych, takich jak iOS z ARC (Automatyczne Liczenie Odwołań), zwalnianie pamięci dla obiektów z cyklicznymi odniesieniami nie odbywa się automatycznie, ponieważ ARC nie potrafi rozbijać cykli odniesień.
Aby rozwiązać ten problem, używa się słabych (weak) i bezwładnych (unowned) odniesień, które nie zwiększają licznika odniesień obiektu. Pozwala to na przerwanie cykli i poprawne zwolnienie pamięci.
Przykład:
class Person {
var name: String
weak var apartment: Apartment? // słabe odniesienie
init(name: String) {
self.name = name
}
}
class Apartment {
let unit: String
unowned let tenant: Person // bezwładne odniesienie
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
}
}
Tutaj Person i Apartment odwołują się do siebie nawzajem, ale jedno z odniesień jest słabe, co zapobiega wyciekom pamięci.
Jeśli cykle odniesień nie zostaną przerwane, obiekty pozostaną w pamięci mimo braku zewnętrznych odniesień, co doprowadzi do wycieków pamięci.