Wat is automatische linktelling?
sobes.tech AI
Antwoord van AI
Automatisch Referentie Telling (Automatic Reference Counting, ARC) is een geheugenbeheersysteem in Swift en Objective-C dat automatisch het geheugen dat aan objecten is toegewezen, bijhoudt en vrijmaakt. Elke klasse-instantie heeft een referentieteller die toeneemt bij het maken van een sterke verwijzing naar het object en afneemt bij het verwijderen ervan. Wanneer de referentieteller op nul komt, dealloceert ARC het object automatisch en vrijmaakt het gebruikte geheugen.
ARC voorkomt geheugenlekken en dubbele vrijgaven, waardoor het geheugenbeheer wordt vereenvoudigd in vergelijking met handmatig beheer (zoals in Objective-C zonder ARC).
Er zijn drie typen verwijzingen:
- Strong (Sterk): Verhoogt de referentieteller van het object. Dit is het standaardtype verwijzing.
- Weak (Zwak): Verhoogt de referentieteller niet. Wordt gebruikt om cycli van sterke verwijzingen te voorkomen, wanneer twee objecten naar elkaar verwijzen. De zwakke verwijzing wordt
nilals het doelobject wordt gedealloceerd. Gedefinieerd met het sleutelwoordweak. - Unowned (Zonder eigenaar): Verhoogt de referentieteller niet en heeft altijd een waarde. Wordt gebruikt wanneer bekend is dat de verwijzing altijd naar een object wijst zolang dat object bestaat. In tegenstelling tot
weak, wordt deunownedverwijzing nietnilen kan een fout veroorzaken bij toegang na de deallocatie. Gedefinieerd met het sleutelwoordunowned.
Voorbeeld van een cyclus van sterke verwijzingen:
class Human {
let name: String
var apartment: Apartment? // Sterke verwijzing naar een optioneel Apartment
init(name: String) {
self.name = name
print("\(name) wordt geïnitialiseerd")
}
deinit {
print("\(name) wordt gedeinitialiseerd")
}
}
class Apartment {
let unit: String
var tenant: Human? // Sterke verwijzing naar een optioneel Human
init(unit: String) {
self.unit = unit
print("Appartement \(unit) wordt geïnitialiseerd")
}
deinit {
print("Appartement \(unit) wordt gedeinitialiseerd")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// Er wordt geen "John Appleseed wordt gedeinitialiseerd" of "Appartement 4A wordt gedeinitialiseerd" weergegeven vanwege de cyclus van sterke verwijzingen
Oplossing voor de cyclus van sterke verwijzingen met behulp van weak:
class Human {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) wordt geïnitialiseerd")
}
deinit {
print("\(name) wordt gedeinitialiseerd")
}
}
class Apartment {
let unit: String
weak var tenant: Human? // Zwakke verwijzing
init(unit: String) {
self.unit = unit
print("Appartement \(unit) wordt geïnitialiseerd")
}
deinit {
print("Appartement \(unit) wordt gedeinitialiseerd")
}
}
var john: Human?
var unit4A: Apartment?
john = Human(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil // John wordt gedealloceerd omdat zijn referentieteller 0 wordt
unit4A = nil // Appartement wordt gedealloceerd omdat zijn referentieteller 0 wordt