Sobes.tech
Middle+

Come implementeresti la pulizia della memoria tramite tipi memorizzati e chiavi?

sobes.tech AI

Risposta dell'AI

Utilizzerei NSCache o gestori di cache specializzati. NSCache gestisce automaticamente la memoria, scaricando gli oggetti quando necessario.

Esempio con NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache per i dati

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Salva i dati con la chiave
    }

    func getData(forKey key: String) -> Data? {
        let nsKey = key as NSString
        guard let nsData = cache.object(forKey: nsKey) else {
            return nil
        }
        return nsData as Data // Ottieni i dati con la chiave
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Rimuovi i dati con la chiave
    }

    func removeAllData() {
        cache.removeAllObjects() // Pulisci tutta la cache
    }
}

NSCache ha vantaggi rispetto a NSDictionary o Swift.Dictionary per il caching:

  • Rimozione automatica: Rimuove gli oggetti quando la memoria è insufficiente.
  • Sicurezza multi-thread: Sicuro da usare in diversi thread.
  • Riferimenti deboli: Non mantiene riferimenti forti agli oggetti, prevenendo perdite di memoria.

Per logiche di caching più complesse (ad esempio, con scadenza o limite di dimensione), si può creare una propria classe gestore che avvolge NSCache o usare altri meccanismi (come l'archiviazione su disco con gestione tramite il file system).