Middle+
Ako by ste implementovali čiščenje pamäti pomocou uložených typov a kľúčov?
sobes.tech AI
Odpoveď od AI
Použil by som NSCache alebo špecializovaných správcu cache. NSCache automaticky spravuje pamäť a pri nedostatku uvoľňuje objekty.
Príklad s NSCache:
import Foundation
class DataCache {
private let cache = NSCache<NSString, NSData>() // Cache pre dáta
func setData(_ data: Data, forKey key: String) {
let nsKey = key as NSString
let nsData = data as NSData
cache.setObject(nsData, forKey: nsKey) // Uložiť dáta podľa kľúča
}
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 // Získať dáta podľa kľúča
}
func removeData(forKey key: String) {
let nsKey = key as NSString
cache.removeObject(forKey: nsKey) // Odstrániť dáta podľa kľúča
}
func removeAllData() {
cache.removeAllObjects() // Vyčistiť celý cache
}
}
NSCache má výhody oproti NSDictionary alebo Swift.Dictionary pre cache:
- Automatické odstraňovanie: Odstraňuje objekty pri nedostatku pamäti.
- Bezpečnosť v multi-thread prostredí: Bezpečný na použitie z rôznych vlákien.
- Slabé odkazy: Neudržiava silné odkazy na objekty, čím zabraňuje únikom pamäti.
Pre zložitejšiu logiku cache (napríklad s expiráciou alebo obmedzením veľkosti) si môžete vytvoriť vlastnú triedu správcu, ktorá obaluje NSCache, alebo použiť iné mechanizmy (napríklad ukladanie na disk s riadením cez súborový systém).