Sobes.tech
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 се деиницијализује