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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
文件夹__iOS7 小时前
AsyncStream 进阶实战:SwiftUI 全局消息流极简实现
ios·swiftui·swift
2501_9160088910 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
忆江南10 小时前
Flutter深度全解析
ios
山水域10 小时前
Swift 6 严格并发检查:@Sendable 与 Actor 隔离的深度解析
ios
楚轩努力变强11 小时前
iOS 自动化环境配置指南 (Appium + WebDriverAgent)
javascript·学习·macos·ios·appium·自动化
游戏开发爱好者81 天前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
黑码哥1 天前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
2501_915106321 天前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
2501_915106321 天前
使用 Sniffmaster TCP 抓包和 Wireshark 网络分析
网络协议·tcp/ip·ios·小程序·uni-app·wireshark·iphone
熊猫钓鱼>_>1 天前
移动端开发技术选型报告:三足鼎立时代的开发者指南(2026年2月)
android·人工智能·ios·app·鸿蒙·cpu·移动端