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).