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 ή να χρησιμοποιήσετε άλλους μηχανισμούς (π.χ., αποθήκευση στον δίσκο με διαχείριση μέσω του συστήματος αρχείων).