Intern
Šta je sakupljač smeća (garbage collector)?
sobes.tech АИ
Одговор од АИ
У iOS-у нема традиционог механизма сакупљања смећа. Уместо тога, користи се механизам Automatic Reference Counting (ARC).
- Аутоматски механизам: ARC аутоматски броји јаке референце на објекте.
- Освобођење меморије: Када број јаких референци на објекат достигне нулу, ARC ослобађа додељену меморију.
- Превенција цурења: Правилна употреба јаке, слабље и безнадзорне (unowned) референце омогућава спречавање цурења меморије и циклуса јаке референце.
Типови референци у ARC:
- Јака (strong): Увеличава бројач референци. По подразумеваној вредности.
- Слаба (weak): Не повећава бројач референци. Аутоматски постаје
nilприликом деалокације објекта. Користи се за спречавање циклуса јаке референце. Објављује се као опциони тип. - Безнадзорна (unowned): Не повећава бројач референци. Гарантовано је да објекат на који се референца односи постоји током целог живота безнадзорне референце. Нема као опциони. Користи се када два објекта имају међусобну јаку везу, али један од њих има краћи животни циклус.
Предности ARC:
- Предвидљивост: Освобађање меморије се дешава детерминисано, чим објекат више није у употреби.
- Перформансе: Нема додатних трошкова за позадинско сакупљање смећа које може изазвати заустављања.
- Једноставност: Развојач не мора ручно управљати меморијом у већини случајева, али мора разумети принципе бројања референци како би спречио цурење.
Пример циклуса јаке референце:
class Person {
let name: String
var apartment: Apartment? // јача референца на Apartment
init(name: String) { self.name = name }
deinit { print("\(name) се деактивира") }
}
class Apartment {
let unit: String
weak var tenant: Person? // слаба референца на Person да спречи циклус
init(unit: String) { self.unit = unit }
deinit { print("Апартман \(unit) се деактивира") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Користи се weak овде критично
john = nil
unit4A = nil
// Без weak tenant: И John и апартман не би били деактивирани.
// Са weak tenant: И John и апартман су правилно деактивирани.