Middle
Ի՞նչ է տարբերությունը աղբահանության հավաքողի (garbage collector) և ավտոմատ հիշողության կառավարիչ (ARC) միջև։
sobes.tech AI
Պատասխան AI-ից
Ավտոմատ հավաքողը ինքնաբերաբար գտնում և ազատում է հիշողությունը, որը այլևս չի օգտագործվում ծրագրի կողմից: Նա աշխատում է ֆոնային ռեժիմում, ժամանակ առ ժամանակ սկանավորում է հողամասը և նույնականացնում օբյեկտները, որոնց վրա ակտիվ հղումներ չկան:
ARC (Automatic Reference Counting)-ը Swift և Objective-C-ում կառավարում է օբյեկտների կյանքը՝ հաշվելով յուրաքանչյուր օբյեկտի վրա ուժեղ հղումների քանակը: Երբ ուժեղ հղումների քանակը օբյեկտի վրա հասնում է զրոյի, ARC-ը ինքնաբերաբար ազատում է այդ օբյեկտի զբաղեցրած հիշողությունը:
Հիմնական տարբերությունները՝
| Գծագիր | Հավաքողը | ARC |
|---|---|---|
| Աշխատանքի սկզբունք | Անհասանելի օբյեկտների որոնում | Ուժեղ հղումների հաշիվը |
| Անհասանելիության պահը | Անհատական, սկանավորման ժամանակ | Դիտարկվող, երբ հղումները զրոյական են |
| Օգտագործման ծախսերը | Դադարներ ծրագրի կատարման ժամանակ | Փոքր, փոփոխության ժամանակ |
| Նախատեսելիություն | Նվազ, սկանավորման ժամանակ | Բարձր, երբ հղումները զրոյական են |
| Շրջանառական հղումներ | Պահանջում են հատուկ մոտեցումներ (օրինակ՝ թույլ հղումներ) | Պահանջում են 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 օբյեկտը դեինիցիալիզացվում է