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