Sobes.tech
Intern

Kas ir atkritumu savāktājs (garbage collector)?

sobes.tech AI

Atbilde no AI

iOS nav tradicionārs atkritumu savācējs. Tā vietā tiek izmantots Automatic Reference Counting (ARC) mehānisms.

  • Automātiskais mehānisms: ARC automātiski skaita stiprās atsauces uz objektiem.
  • Atmiņas atbrīvošana: Kad stipro atsauču skaits uz objektu sasniedz nulli, ARC atbrīvo piešķirto atmiņu.
  • Lai novērstu noplūdes: Pareiza stipro, vāju un bezpiederīgo (unowned) atsauču lietošana ļauj novērst atmiņas noplūdes un stipro atsauču ciklus.

ARC atsauču veidi:

  • Stipra (strong): Palielina atsauču skaitītāju. Noklusējuma.
  • Vāja (weak): Nepalielina atsauču skaitītāju. Automātiski kļūst par nil objekta dealloc laikā. Lieto, lai novērstu ciklus stiprajās atsaucēs. Deklarē kā opciju tipu.
  • Bezpiederīga (unowned): Nepalielina atsauču skaitītāju. Garantē, ka objekts, uz kuru tā attiecas, pastāv visu dzīves cikla laiku. Nav opciju. Lieto, ja divi objekti ir savstarpēji stipri saistīti, bet viens no tiem ir īslaicīgāks.

ARC priekšrocības:

  • Prognozējamība: Atmiņas atbrīvošana notiek deterministiski, tiklīdz objekts vairs netiek izmantots.
  • Veiktspēja: Nav papildu izmaksu fonā esošajam atkritumu savācējam, kas var izraisīt apstāšanos.
  • Vienkāršība: Izstrādātājam nav jāvada atmiņa manuāli lielākajā daļā gadījumu, bet jāizprot atsauču skaitīšanas principi, lai novērstu noplūdes.

Piemērs stipro atsauču ciklam:

class Person {
    let name: String
    var apartment: Apartment? // stipra atsauce uz Apartment

    init(name: String) { self.name = name }
    deinit { print("\(name) tiek dezinicializēts") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // vāja atsauce uz Person, lai novērstu ciklu

    init(unit: String) { self.unit = unit }
    deinit { print("Apartment \(unit) tiek dezinicializēts") }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // Izmanto weak, tas ir ļoti svarīgi

john = nil
unit4A = nil
// Bez weak tenant: Abi john un unit4A nebūs dezinicializēti.
// Ar weak tenant: Abi john un unit4A ir pareizi dezinicializēti.