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