Sobes.tech
Intern

Чӣ тавр ҷамъоварии партовҳо (garbage collector)?

sobes.tech AI

Ҷавоб аз AI

В iOS няма традиционен механизъм за събиране на отпадъци. Вместо това се използва механизмът Automatic Reference Counting (ARC).

  • Автоматичен механизъм: ARC автоматично брои силните препратки към обекти.
  • Освобождаване на паметта: Когато броят на силните препратки към обект достигне нула, ARC освобождава заделената памет.
  • Предотвратяване на течове: Правилната употреба на силни, слаби и бездомни (unowned) препратки позволява предотвратяване на течове на памет и цикли на силни препратки.

Типове препратки в ARC:

  • Силна (strong): Увеличава брояча на препратките. По подразбиране.
  • Слаба (weak): Не увеличава брояча на препратките. Автоматично става nil при деалокация на обекта. Използва се за предотвратяване на цикли на силни препратки. Обявява се като опционален тип.
  • Бездомна (unowned): Не увеличава брояча на препратките. Гарантирано е, че обектът, към който се отнася, съществува през целия жизнен цикъл на бездомната препратка. Не е опционална. Използва се, когато двама обекта имат взаимна силна връзка, но един от тях има по-кратък жизнен цикъл.

Предимства на ARC:

  • Предсказуемост: Освобождаването на паметта става детерминирано, веднага щом обектът вече не се използва.
  • Производителност: Няма допълнителни разходи за фоново събиране на отпадъци, което може да причини паузи.
  • Простота: Разработчикът не трябва ръчно да управлява паметта в повечето случаи, но трябва да разбира принципите на броенето на препратки, за да предотврати течове.

Пример за цикъл на силни препратки:

class Person {
    let name: String
    var apartment: Apartment? // силна препратка към Apartment

    init(name: String) { self.name = name }
    deinit { print("\(name) се деактивира") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // слаба препратка към Person за предотвратяване на цикъл

    init(unit: String) { self.unit = 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 // Използването на weak е критично

john = nil
unit4A = nil
// Без weak tenant: И двамата john и unit4A няма да бъдат деактивирани.
// С weak tenant: И двамата john и unit4A са правилно деактивирани.