Sobes.tech
Middle+

Como implementaria a limpeza de memória através de tipos armazenados e chaves?

sobes.tech IA

Resposta da IA

Utilizaria NSCache ou gestores de cache especializados. NSCache gerencia automaticamente a memória, descarregando objetos quando há escassez.

Exemplo com NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache para dados

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Guardar dados por chave
    }

    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 // Obter dados por chave
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Remover dados por chave
    }

    func removeAllData() {
        cache.removeAllObjects() // Limpar toda a cache
    }
}

NSCache tem vantagens sobre NSDictionary ou Swift.Dictionary para caching:

  • Remoção automática: Remove objetos quando há escassez de memória.
  • Segurança em múltiplas threads: Seguro para uso de diferentes threads.
  • Referências fracas: Não mantém referências fortes aos objetos, prevenindo vazamentos de memória.

Para lógica de cache mais complexa (por exemplo, com expiração ou limite de tamanho), pode criar sua própria classe gerenciadora que encapsula NSCache ou usar outros mecanismos (como armazenamento em disco com gerenciamento via sistema de arquivos).