iOS LRU 缓存算法实现详解及示例代码
iOS 中实现 LRU 算法的方法如下:
- 创建一个 NSMutableDictionary 对象,用于存储缓存数据。
- 将每个新的缓存数据添加到 NSMutableDictionary 对象中,并将其设置为最近使用的数据。
- 当需要访问缓存数据时,首先检查 NSMutableDictionary 对象中是否存在该数据。
- 如果存在该数据,则将其从 NSMutableDictionary 对象中移动到最近使用的位置。
- 如果 NSMutableDictionary 对象中的数据量超过了预设值,则删除最旧的数据。
- 在应用程序退出时,将 NSMutableDictionary 对象中的数据保存到磁盘上,以便下次启动应用程序时可以恢复缓存数据。
下面是一个示例代码:
@interface LRUCache : NSObject
@property (nonatomic, assign) NSUInteger capacity;
@property (nonatomic, strong) NSMutableDictionary *cache;
@property (nonatomic, strong) NSMutableOrderedSet *orderedKeys;
- (instancetype)initWithCapacity:(NSUInteger)capacity;
- (id)objectForKey:(id)key;
- (void)setObject:(id)object forKey:(id)key;
- (void)removeObjectForKey:(id)key;
- (void)clearCache;
@end
@implementation LRUCache
- (instancetype)initWithCapacity:(NSUInteger)capacity {
self = [super init];
if (self) {
_capacity = capacity;
_cache = [NSMutableDictionary dictionary];
_orderedKeys = [NSMutableOrderedSet orderedSet];
}
return self;
}
- (id)objectForKey:(id)key {
id object = [self.cache objectForKey:key];
if (object) {
// 将数据移动到最近使用的位置
[self.orderedKeys removeObject:key];
[self.orderedKeys addObject:key];
}
return object;
}
- (void)setObject:(id)object forKey:(id)key {
if (object && key) {
// 将新数据添加到最近使用的位置
[self.orderedKeys removeObject:key];
[self.orderedKeys addObject:key];
// 删除最旧的数据
if (self.orderedKeys.count > self.capacity) {
id oldestKey = [self.orderedKeys firstObject];
[self.cache removeObjectForKey:oldestKey];
[self.orderedKeys removeObject:oldestKey];
}
// 存储新数据
[self.cache setObject:object forKey:key];
}
}
- (void)removeObjectForKey:(id)key {
[self.cache removeObjectForKey:key];
[self.orderedKeys removeObject:key];
}
- (void)clearCache {
[self.cache removeAllObjects];
[self.orderedKeys removeAllObjects];
}
@end
在上面的示例代码中,LRUCache 类包含了一个 NSMutableDictionary 对象和一个 NSMutableOrderedSet 对象,用于实现 LRU 算法。具体实现中,LRUCache 类提供了以下方法:
- initWithCapacity: 初始化方法,用于指定缓存的容量。
- objectForKey: 获取指定 key 的缓存数据,如果存在,则将其从 NSMutableOrderedSet 对象中移动到最近使用的位置。
- setObject:forKey: 存储指定 key 的缓存数据,如果 NSMutableDictionary 对象中的数据量超过了预设值,则删除最旧的数据。
- removeObjectForKey: 删除指定 key 的缓存数据。
- clearCache: 清除缓存中的所有数据。
原文地址: https://www.cveoy.top/t/topic/mLJV 著作权归作者所有。请勿转载和采集!