iOS中一个被忽视的类NSCache

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

在日常开发中,对相同内容做重复的请求没有什么意义而且还会影响应用程序的性能,因此经常会需要存储一些临时内容,以便重用,例如从网络加载的图片、文件等。

在 Swift 中系统为我们提供了 NSCache,可以在内存中存储临时数据。它是一个可变集合,以键值对的形式存储,而且 NSCache 自带清除功能,这些键值对在资源不足时会被清除。

很多第三方库的底层其实都在用 NSCache 做存储,比如常用的 Kingfisher,因为它非常的简单易用,又安全。

使用方法

1. 初始化

NSCacheKeyValue 都是范型,因此需要在声明的时候指定其类型,比如我这里存储的 keyNSStringvalueUIImage:

swift 复制代码
let cache = NSCache<NSString, UIImage>()

KeyValue 都必须是 AnyObject,因此值类型是不能用 NSCache 存储的

2. 添加对象到缓存

less 复制代码
cache.setObject(UIImage(named: "apple.png")!, forKey: "apple")

3. 从缓存中获取对象

csharp 复制代码
let image = cache.object(forKey: "apple")

4. 设置缓存最大对象数

ini 复制代码
cache.countLimit = 100

如果设置为 0,则不限制存储数量,默认值为 0

这个参数并不是一个严格的限制,如果缓存超过了设置的限制,缓存中的对象可能会立即释放,也可能稍后释放,这取决于底层的实现细节。

5. 设置最大存储容量

ini 复制代码
cache.totalCostLimit = 1024 * 1024 * 100 

以上代码设置了 100MB 的存储容量,也就是说,如果超过了这个值,就会开始清除缓存的对象。

6. 移除某个缓存

less 复制代码
cache.removeObject(forKey: "apple")

7. 移除所有缓存

scss 复制代码
cache.removeAllObjects()

8. 即将被移除的代理监听

NSCache 还提供了一个代理,当对象即将从缓存中清除或删除时调用,首先绑定代理:

ini 复制代码
cache.delegate = self

然后实现代理方法:

swift 复制代码
extension ViewController: NSCacheDelegate {
    func cache(_ cache: NSCache<AnyObject, AnyObject>, willEvictObject obj: Any) {
        // obj 缓存将要被移除时执行
    }
}

NSCache 的优势

  1. 自动内存管理 :当系统内存不足时,NSCache会自动删除部分缓存对象。

  2. 线程安全:可以在多个线程中同时使用,无需加锁。

  3. 键-值对存储 :提供了类似 NSDictionary 的接口,但比 NSDictionary 更适合用作缓存。

NSCache 的缺陷

  1. 不可控性 :这是最大的缺点,苹果文档中也有描述,即使你设置了 countLimittotalCostLimit,也不能保证何时清除缓存或清除哪些对象。

  2. 缺乏持久性:这些数据不是存储在磁盘上的,当应用程序重启后,缓存的数据将被清空。

  3. 无法设置过期时间 :与其他一些缓存机制相比,NSCache 无法为单个对象设置过期时间,Kingfisher 中的过期时间也是作者自己实现的。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
我不是8神9 小时前
gin与gorm框架知识点总结
ios·iphone·gin
皇上o_O17 小时前
深入理解 Swift Concurrency:从 async/await 到隔离域
ios
CocoaKier19 小时前
1月12日最新用户隐私保护政策出炉,政策解读
ios
Mr -老鬼1 天前
移动端跨平台适配技术框架:从发展到展望
android·ios·小程序·uni-app
tiantian_cool2 天前
Claude Code 四大核心技能使用指南
ios
冰淇淋真好吃2 天前
iOS实现 WKWebView 长截图的优雅方案
ios
njsgcs2 天前
Swift playground 网页刷新切换随机页面的网页查看器WebKit
swift
前端不太难2 天前
Flutter / RN / iOS,在长期维护下的性能差异本质
flutter·ios
搜狐技术产品小编20233 天前
精通 UITableViewDiffableDataSource——从入门到重构的现代 iOS 列表开发指南
ios·重构
tangweiguo030519873 天前
SwiftUI 状态管理完全指南:从 @State 到 @EnvironmentObject
ios