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 са правилно деактивирани.