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 объектинин жыйынтыкталууусу