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") }
}