Middle
У чему се састоји разлика између сакупљача смећа (garbage collector) и аутоматског управљања меморијом (ARC)?
sobes.tech АИ
Одговор од АИ
Автоматски управљач за сакупљање смећа автоматски проналази и ослобађа меморију која више није у употреби од стране програма. Ради у позадини, периодично скенирајући хип и идентификујући објекте на које нема активних референци.
ARC (Automatic Reference Counting) у Swift и Objective-C управља животом објеката пребројавајући број јаких референци на сваки објекат. Чим број јаких референци на објекат достигне нулу, ARC аутоматски ослобађа меморију коју је тај објекат заузео.
Основне разлике:
| Карактеристика | Сакупљач смећа | ARC |
|---|---|---|
| Принцип рада | Проналажење недостижних објеката | Бројање јаких референци |
| Момент ослобађања | Непредвидив, при скенирању | Предвидив, када је референца 0 |
| Трошкови накнаде | Пауза у извршавању програма (при сакупљању) | Мали, при променама броја референци |
| Предвидљивост | Ниска | Висока |
| Цикличне референце | Захтевају посебне приступе (нпр. слабe референце) | Захтевају коришћење weak или unowned референци |
| Коришћење у iOS | Недоступно у савременом Objective-C и Swift | Главни механизам управљања меморијом у Objective-C и Swift |
Пример коришћења weak за спречавање циклуса јаких референци у ARC:
class Person {
let name: String
var apartment: Apartment? // јака референца
init(name: String) {
self.name = name
print("\(name) се иницијализује")
}
deinit {
print("\(name) се деиницијализује")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // слабa референца
init(unit: String) {
self.unit = unit
print("Апартман \(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 // слабa референца спречава задржавање циклуса
john = nil // објекат Person се деиницијализује
unit4A = nil // објекат Apartment се деиницијализује