MST

星途 面试题库

面试题:Objective-C中NSCache基本原理及简单使用场景

请简述Objective-C中NSCache的基本原理,并举例说明一个适合使用NSCache的简单场景,同时写出对应的代码实现。
19.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

NSCache基本原理

  1. 内存管理特性NSCache是一个线程安全的缓存集合类,用于存储对象。它和NSDictionary类似,但具有自动释放内存的特性。当系统内存不足时,NSCache会自动释放部分或全部缓存对象,以帮助系统回收内存。
  2. 对象管理:它使用键值对的方式存储对象,键和值都必须是对象类型(不能是基本数据类型)。NSCache不会复制键对象,而是持有键对象的强引用,对值对象同样持有强引用。
  3. 缓存限制:可以通过设置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属性imageCacheloadImageWithName:方法首先检查缓存中是否有指定名称的图片,如果没有则从磁盘加载,并将其存入缓存。同时设置了缓存的数量限制和总“成本”限制。