Sobes.tech
Middle+

Wie würden Sie die Speicherbereinigung durch gespeicherte Typen und Schlüssel implementieren?

sobes.tech KI

Antwort von AI

Ich würde NSCache oder spezialisierte Cache-Manager verwenden. NSCache verwaltet den Speicher automatisch und entlädt Objekte bei Bedarf.

Beispiel mit NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache für Daten

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

    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 // Daten abrufen
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Daten entfernen
    }

    func removeAllData() {
        cache.removeAllObjects() // Cache leeren
    }
}

NSCache hat Vorteile gegenüber NSDictionary oder Swift.Dictionary für Caching:

  • Automatisches Entfernen: Entfernt Objekte bei Speicherknappheit.
  • Thread-Sicherheit: Sicher in der Verwendung aus verschiedenen Threads.
  • Schwache Referenzen: Hält keine starken Referenzen auf Objekte, was Speicherlecks verhindert.

Für komplexere Cache-Logik (z.B. mit Ablaufzeit oder Größenbeschränkung) kann man eine eigene Klasse erstellen, die NSCache umschließt, oder andere Mechanismen verwenden (z.B. Speicherung auf der Festplatte mit Dateisystemverwaltung).