面试题答案
一键面试NSCache基本原理
- 内存管理特性:
NSCache
是一个线程安全的缓存集合类,用于存储对象。它和NSDictionary
类似,但具有自动释放内存的特性。当系统内存不足时,NSCache
会自动释放部分或全部缓存对象,以帮助系统回收内存。 - 对象管理:它使用键值对的方式存储对象,键和值都必须是对象类型(不能是基本数据类型)。
NSCache
不会复制键对象,而是持有键对象的强引用,对值对象同样持有强引用。 - 缓存限制:可以通过设置
countLimit
属性来限制缓存中对象的最大数量,通过设置totalCostLimit
属性来限制缓存对象的总“成本”(通过为每个存储的对象指定一个cost
值来衡量)。
适合使用NSCache的场景
图片缓存场景:在一个图片浏览应用中,当用户浏览大量图片时,为了避免每次都从磁盘或网络加载图片,可以将图片缓存起来。由于图片占用内存较大,使用NSCache
能够在内存紧张时自动释放图片,避免内存警告甚至应用崩溃。
代码实现
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, strong) NSCache *imageCache;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.imageCache = [[NSCache alloc] init];
// 设置缓存对象最大数量为100
self.imageCache.countLimit = 100;
// 设置缓存对象总“成本”为10000(假设每个图片的“成本”为100)
self.imageCache.totalCostLimit = 10000;
}
- (UIImage *)loadImageWithName:(NSString *)imageName {
UIImage *image = [self.imageCache objectForKey:imageName];
if (!image) {
// 如果缓存中没有,从磁盘加载图片(这里假设图片在bundle中)
NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"];
image = [UIImage imageWithContentsOfFile:path];
if (image) {
// 将加载的图片存入缓存,并设置“成本”为100
[self.imageCache setObject:image forKey:imageName cost:100];
}
}
return image;
}
@end
在上述代码中,ViewController
类有一个NSCache
属性imageCache
。loadImageWithName:
方法首先检查缓存中是否有指定名称的图片,如果没有则从磁盘加载,并将其存入缓存。同时设置了缓存的数量限制和总“成本”限制。