Sobes.tech
Junior

Kaip veikia šiukšlių surinkėjas?

sobes.tech AI

Atsakymas iš AI

iOS/macOS kūrimo kontekste Swift/Objective-C naudoja ne šiukšlių surinkėją (GC), o automatinį nuorodų skaičiavimą (Automatic Reference Counting, ARC).

ARC automatiškai valdo atmintį, skaičiuodamas kiekvieno klasės pavyzdžio (ir užfiksuotų užbaigimų) stipriųjų nuorodų skaičių. Kai stipriųjų nuorodų skaitiklis pasiekia nulį, sistema atlaisvina objekto užimamą atmintį:

ARC pagrindiniai aspektai:

  • Stipriosios nuorodos (Strong): didina nuorodų skaičių. Objektas lieka atmintyje, kol yra bent viena stipri nuoroda:
  • Sunkiosios nuorodos (Weak): neskaičiuoja nuorodų skaičiaus. Naudojamos ciklų prevencijai stipriųjų nuorodų. Sunkiosios nuorodos yra pasirenkamos ir tampa nil, kai objektas yra atlaisvinamas:
  • Nepasiekiamos nuorodos (Unowned): neskaičiuoja nuorodų skaičiaus. Naudojamos, kai žinoma objektų gyvavimo ciklas ir vienas objektas visada egzistuos kito gyvavimo metu. Nuoroda nėra pasirenkama. Jei nuoroda nukreipia į atlaisvintą objektą, tai sukelia vykdymo klaidą:

ARC veikia kompiliacijos metu, įterpdama retain (padidinti skaitiklį) ir release (sumažinti skaitiklį) iškvietimus atitinkamame kode:

class MyClass {  
    var prop: String = ""  
}

var reference1: MyClass? = MyClass() // Skaitiklis = 1
var reference2 = reference1 // Skaitiklis = 2

reference1 = nil // Skaitiklis = 1
reference2 = nil // Skaitiklis = 0, objektas atlaisvinamas
class Person {  
    let name: String
    weak var apartment: Apartment? // Sunkioji nuoroda ciklų prevencijai
    init(name: String) { self.name = name; print("(vardas) inicijuojamas") }
    deinit { print("(vardas) išlaisvinamas") }
}

class Apartment {  
    let unit: String
    unowned var tenant: Person // Nepasiekiama nuoroda
    init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Apartment \(unit) inicijuojamas") }
    deinit { print("Apartment \(unit) išlaisvinamas") }
}