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