Middle+
Jak zaimplementowałbyś czyszczenie pamięci za pomocą typów przechowywanych i kluczy?
sobes.tech AI
Odpowiedź od AI
Używałbym NSCache lub specjalistycznych menedżerów pamięci podręcznej. NSCache automatycznie zarządza pamięcią, zwalniając obiekty w razie potrzeby.
Przykład z NSCache:
import Foundation
class DataCache {
private let cache = NSCache<NSString, NSData>() // Pamięć podręczna dla danych
func setData(_ data: Data, forKey key: String) {
let nsKey = key as NSString
let nsData = data as NSData
cache.setObject(nsData, forKey: nsKey) // Zapisz dane pod kluczem
}
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 // Pobierz dane pod kluczem
}
func removeData(forKey key: String) {
let nsKey = key as NSString
cache.removeObject(forKey: nsKey) // Usuń dane pod kluczem
}
func removeAllData() {
cache.removeAllObjects() // Wyczyść całą pamięć podręczną
}
}
NSCache ma przewagę nad NSDictionary lub Swift.Dictionary w zakresie cache:
- Automatyczne usuwanie: Usuwa obiekty w przypadku braku pamięci.
- Bezpieczeństwo wątków: Bezpieczny do użycia z różnych wątków.
- Słabe referencje: Nie trzyma silnych referencji do obiektów, co zapobiega wyciekom pamięci.
Dla bardziej złożonej logiki cache (np. z wygasaniem lub ograniczeniem rozmiaru) można stworzyć własną klasę menedżera, która opakowuje NSCache, lub użyć innych mechanizmów (np. przechowywanie na dysku z zarządzaniem przez system plików).