Sobes.tech
Middle

Qual è la differenza tra il garbage collector e la gestione automatica della memoria (ARC)?

sobes.tech AI

Risposta dell'AI

Il garbage collector trova e libera automaticamente la memoria che non viene più utilizzata dal programma. Funziona in background, eseguendo periodicamente la scansione dell'heap e identificando gli oggetti a cui non ci sono riferimenti attivi.

ARC (Contatore di Riferimento Automatico) in Swift e Objective-C gestisce la durata degli oggetti contando il numero di riferimenti forti a ciascun oggetto. Quando il conteggio delle riferimenti forti di un oggetto raggiunge zero, ARC libera automaticamente la memoria occupata da quell'oggetto.

Principali differenze:

Caratteristica Garbage collector ARC
Principio di funzionamento Ricerca di oggetti inaccessibili Conteggio di riferimenti forti
Momento di rilascio Non deterministico, durante la scansione Deterministico, quando il conteggio raggiunge 0
Costi aggiuntivi Pause durante l'esecuzione del programma (durante la raccolta) Minimi, durante la modifica del contatore
Prevedibilità Bassa Alta
Riferimenti ciclici Richiedono approcci speciali (ad esempio, riferimenti deboli) Richiedono l'uso di riferimenti weak o unowned
Uso in iOS Assente in Objective-C e Swift moderni Meccanismo principale di gestione della memoria in Objective-C e Swift

Esempio di utilizzo di weak per prevenire cicli di riferimenti forti in ARC:

class Person {
    let name: String
    var apartment: Apartment? // riferimento forte

    init(name: String) {
        self.name = name
        print("\(name) viene inizializzato")
    }
    deinit {
        print("\(name) viene de-inizializzato")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // riferimento debole

    init(unit: String) {
        self.unit = unit
        print("Appartamento \(unit) viene inizializzato")
    }
    deinit {
        print("Appartamento \(unit) viene de-inizializzato")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // riferimento debole previene ciclo di ritenzione

john = nil // Oggetto Person viene de-inizializzato
unit4A = nil // Oggetto Apartment viene de-inizializzato