Sobes.tech
Junior

Kā darbojas atkritumu savācējs?

sobes.tech AI

Atbilde no AI

iOS/macOS izstrādes kontekstā Swift/Objective-C izmanto ne atkritumu savācēju (GC), bet automātisko atsauču skaitīšanu (Automatic Reference Counting, ARC).

ARC automātiski pārvalda atmiņu, skaitot katra klases piemēra (un aizķertajām slēptajām funkcijām) stipro atsauču skaitu. Kad stipro atsauču skaitītājs sasniedz nulli, sistēma atbrīvo objekta aizņemtās atmiņas:

Galvenie ARC aspekti:

  • Stipras atsauces (Strong): palielina atsauču skaitu. Objekts paliek atmiņā, kamēr ir vismaz viena stipra atsauce:
  • Vājās atsauces (Weak): nesaskaita atsauču skaitu. Izmanto ciklu novēršanai stiprajās atsaucēs. Vājās atsauces ir opcijas un kļūst nil, kad objekts tiek atbrīvots:
  • Nepieejamas atsauces (Unowned): nesaskaita atsauču skaitu. Izmanto, ja ir zināms objektu dzīves cikls un viens objekts vienmēr pastāvēs, kamēr pastāv otrs. Atsauce nav opcija. Ja atsauce norāda uz atbrīvotu objektu, tas izraisīs izpildes kļūdu:

ARC darbojas kompilācijas laikā, ievietojot retain (palielināt skaitītāju) un release (samazināt skaitītāju) izsaukumus atbilstošajā kodā:

class MyClass {  
    var prop: String = ""  
}

var reference1: MyClass? = MyClass() // Skaitītājs = 1
var reference2 = reference1 // Skaitītājs = 2

reference1 = nil // Skaitītājs = 1
reference2 = nil // Skaitītājs = 0, objekts tiek atbrīvots
class Person {  
    let name: String
    weak var apartment: Apartment? // Vāja atsauce ciklu novēršanai
    init(name: String) { self.name = name; print("( vārds) tiek inicializēts") }
    deinit { print("(vārds) tiek de-inicializēts") }
}

class Apartment {  
    let unit: String
    unowned var tenant: Person // Nepieejama atsauce
    init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Apartment \(unit) tiek inicializēts") }
    deinit { print("Apartment \(unit) tiek de-inicializēts") }
}