Sobes.tech
Middle+

Πώς θα υλοποιούσατε τον καθαρισμό μνήμης μέσω αποθηκευμένων τύπων και κλειδιών;

sobes.tech AI

Απάντηση από AI

Θα χρησιμοποιούσα το NSCache ή εξειδικευμένους διαχειριστές cache. Το NSCache διαχειρίζεται αυτόματα τη μνήμη, αποφορτίζοντας αντικείμενα όταν χρειάζεται.

Παράδειγμα με NSCache:

import Foundation

class DataCache {
    private let cache = NSCache<NSString, NSData>() // Cache για δεδομένα

    func setData(_ data: Data, forKey key: String) {
        let nsKey = key as NSString
        let nsData = data as NSData
        cache.setObject(nsData, forKey: nsKey) // Αποθήκευση δεδομένων με κλειδί
    }

    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 // Ανάκτηση δεδομένων με κλειδί
    }

    func removeData(forKey key: String) {
        let nsKey = key as NSString
        cache.removeObject(forKey: nsKey) // Διαγραφή δεδομένων με κλειδί
    }

    func removeAllData() {
        cache.removeAllObjects() // Εκκαθάριση όλου του cache
    }
}

Το NSCache έχει πλεονεκτήματα έναντι του NSDictionary ή Swift.Dictionary για caching:

  • Αυτόματη διαγραφή: Διαγράφει αντικείμενα όταν η μνήμη είναι περιορισμένη.
  • Ασφάλεια σε πολλαπλά νήματα: Ασφαλές για χρήση από διαφορετικά νήματα.
  • Αδύναμοι δείκτες: Δεν διατηρεί ισχυρούς δείκτες στα αντικείμενα, αποτρέποντας διαρροές μνήμης.

Για πιο πολύπλοκη λογική cache (π.χ., με λήξη ή περιορισμό μεγέθους), μπορείτε να δημιουργήσετε τη δική σας κλάση διαχειριστή που περικλείει το NSCache ή να χρησιμοποιήσετε άλλους μηχανισμούς (π.χ., αποθήκευση στον δίσκο με διαχείριση μέσω του συστήματος αρχείων).