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