Middle
Тафовут дар байни ҷамъкунандаи партовҳо (garbage collector) ва идоракунии худкории хотира (ARC) чист?
sobes.tech AI
Ҷавоб аз AI
Автоматичният събирач на отпадъци автоматично намира и освобождава памет, която вече не се използва от програмата. Той работи на заден план, периодично сканирайки купчината и идентифицирайки обекти, към които няма активни препратки.
ARC (Automatic Reference Counting) в Swift и Objective-C управлява живота на обектите, като брои броя на силните препратки към всеки обект. Щом броят на силните препратки към обект достигне нула, ARC автоматично освобождава паметта, заета от този обект.
Основни разлики:
| Характеристика | Събирач на отпадъци | ARC |
|---|---|---|
| Принцип на работа | Търсене на недостижими обекти | Броене на силни препратки |
| Момент на освобождаване | Недиференцирано, при сканиране | Диференцирано, при 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 се деинициализира