Sobes.tech
Middle

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:

  1. Strong (Sterk): Verhoogt de referentieteller van het object. Dit is het standaardtype verwijzing.
  2. 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 nil als het doelobject wordt gedealloceerd. Gedefinieerd met het sleutelwoord weak.
  3. 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 de unowned verwijzing niet nil en kan een fout veroorzaken bij toegang na de deallocatie. Gedefinieerd met het sleutelwoord unowned.

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