Junior
Чӣ тавр кор мекунад ҷамъоварии партовҳо?
sobes.tech AI
Ҷавоб аз AI
В контекста на разработката за iOS/macOS, Swift/Objective-C не използва събирач на отпадъци (GC), а автоматично броене на препратки (Automatic Reference Counting, ARC).
ARC автоматично управлява паметта, като брои броя на силните препратки (Strong) към всяка инстанция на клас (и затваряния с каптур). Когато броячът на силните препратки спре на нула, системата освобождава паметта, заета от обекта.
Основни точки за ARC:
- Силни препратки (Strong): Увеличават брояча на препратки. Обектът остава в паметта, докато има поне една силна препратка.
- Зависими препратки (Weak): Не увеличават брояча. Използват се за предотвратяване на цикли на силни препратки. Посочват към опционален обект и стават nil, когато обектът бъде освободен.
- Несвойствени препратки (Unowned): Не увеличават брояча. Използват се, когато е известен жизненият цикъл на обектите и един обект винаги ще съществува, докато съществува друг. Препратката не е опционална. Ако обектът, към който се отнася unowned, бъде освободен, достъпът до него ще доведе до грешка по време на изпълнение.
ARC работи в време на компилация, като вмъква извиквания към retain (увеличаване на брояча) и release (намаляване на брояча) в съответния код.
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // Брояч = 1
var reference2 = reference1 // Брояч = 2
reference1 = nil // Брояч = 1
reference2 = nil // Брояч = 0, обектът се освобождава
class Person {
let name: String
weak var apartment: Apartment? // Зла препратка за избягване на цикъл
init(name: String) { self.name = name; print("\(name) се инициализира") }
deinit { print("\(name) се деинициализира") }
}
class Apartment {
let unit: String
unowned var tenant: Person // Не-закрепена препратка
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Апартамент \(unit) се инициализира") }
deinit { print("Апартамент \(unit) се деинициализира") }
}