Sobes.tech
Middle

Jak zarządzana jest pamięć dla typów referencyjnych w Swift?

sobes.tech AI

Odpowiedź od AI

W Swift zarządzanie pamięcią dla typów referencyjnych (klas) odbywa się za pomocą automatycznego zliczania odwołań (ARC, Automatic Reference Counting). Każdy obiekt na stercie przechowuje licznik odwołań: liczbę aktywnych odwołań do tego obiektu. Gdy tworzona jest nowa referencja do obiektu, licznik rośnie, a gdy referencja przestaje być używana, maleje. Gdy licznik osiąga zero, obiekt jest automatycznie usuwany z pamięci.

Przykład:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var a: Person? = Person(name: "Alice") // licznik = 1
var b = a                             // licznik = 2
b = nil                              // licznik = 1
a = nil                              // licznik = 0, obiekt jest usuwany

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

Typy wartości (struktury, wyliczenia) są przechowywane na stosie i kopiowane podczas przypisania, dlatego ARC nie dotyczy ich.