Sobes.tech
Junior — Middle

Jak odbywa się zwalnianie pamięci obiektów tworzonych z użyciem typu referencyjnego?

sobes.tech AI

Odpowiedź od AI

W iOS obiekty tworzone przy użyciu typów referencyjnych (np. klasy w Swift lub Objective-C) są zarządzane przez system zliczania referencji (ARC — Automatic Reference Counting). Każdy obiekt przechowuje licznik referencji — liczbę aktywnych odwołań do niego. Gdy tworzona jest nowa referencja do obiektu, licznik rośnie, a gdy referencja przestaje być używana (np. zmienna wychodzi z zakresu lub jest przypisana do nil), licznik maleje.

Gdy licznik referencji obiektu osiąga zero, oznacza to, że nikt więcej na niego nie wskazuje, i pamięć zajmowana przez obiekt jest automatycznie zwalniana. Pomaga to unikać wycieków pamięci bez konieczności ręcznego zarządzania.

Przykład w Swift:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
    deinit {
        print("Osoba \(name) zwolniona")
    }
}

var p1: Person? = Person(name: "Ivan")
var p2 = p1 // licznik referencji wzrósł
p1 = nil // licznik zmalał, ale obiekt nadal żyje
p2 = nil // licznik osiągnął 0, obiekt został zwolniony

Ważne jest unikanie cyklicznych referencji (retain cycles), gdy dwa obiekty odwołują się do siebie nawzajem, co uniemożliwia zwolnienie pamięci. W tym celu używa się referencji słabych (weak) lub bezwłaściwych (unowned).