Sobes.tech
Middle

Кайра иштетүүчүнүн (garbage collector) жана автоматтык эс тутум башкаруу (ARC) ортосунда кандай айырма бар?

sobes.tech AI

AIден жооп

Автоматтык чогултуучу автоматтык түрдө программадан колдонулбай калган эс тутумун табат жана бошотот. Ал фондук режимде иштейт, мезгил-мезгили менен кутучаны сканерлеп, активдүү шилтемелер жок объекттерди аныктайт.

ARC (Automatic Reference Counting) Swift жана Objective-Cдө объекттердин жашоосун башкаруу үчүн ар бир объектке күчтүү шилтемелердин санын эсептейт. Объектке күчтүү шилтемелердин саны нөлгө жеткенде, ARC автоматтык түрдө ошол объектке тиешелүү эс тутумду бошотот.

Негизги айырмачылыктар:

Өзгөчөлүк Чогултуучу ARC
Иш принципи Жеткиликсиз объекттерди издөө Күчтүү шилтемелердин эсептөөсү
Бошотуу учуру Бейформал, сканерлөө учурунда Дербестүү, шилтемелер 0 болсо
Надынк чыгымдар Программаны иштетүүдө токтоп калуулар Аз, саноонун өзгөрүшү учурунда
Болжолдуу болушу Төмөн, сканерлөө учурунда Жогорку, шилтемелер 0 болсо
Цикл шилтемелер Өзгөчө ыкмалар талап кылынат (мисалы, алсыз шилтемелер) 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? // алсыз шилтеме

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) ишке киришүүдө")
    }
    deinit {
        print("Apartment \(unit) жыйынтыкталууда")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // алсыз шилтеме циклин алдын алат

john = nil // Person объектинин жыйынтыкталууусу
unit4A = nil // Apartment объектинин жыйынтыкталууусу