MST

星途 面试题库

面试题:Objective-C中图片加载策略与内存优化的基础实现

在Objective-C中,简单描述如何使用NSURLSession来加载图片,并说明在加载过程中如何进行基本的内存优化,例如防止内存峰值过高。
12.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

使用NSURLSession加载图片

  1. 创建NSURLSession对象: 可以通过NSURLSession的类方法创建一个NSURLSession对象。通常使用默认配置创建会话,如下:
    NSURLSession *session = [NSURLSession sharedSession];
    
  2. 创建NSURLRequest: 构建一个指向图片资源的NSURLRequest。假设图片的URL为imageURL
    NSURL *imageURL = [NSURL URLWithString:@"https://example.com/image.jpg"];
    NSURLRequest *request = [NSURLRequest requestWithURL:imageURL];
    
  3. 发起数据任务: 使用NSURLSession发起一个数据任务来加载图片数据。
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error && data) {
            UIImage *image = [UIImage imageWithData:data];
            // 在这里可以将image应用到UI上,如UIImageView
        }
    }];
    [dataTask resume];
    

内存优化

  1. 分段加载: 可以使用NSURLSessionDownloadTask来分段下载图片数据,而不是一次性加载全部数据到内存。
    NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error && location) {
            NSData *data = [NSData dataWithContentsOfURL:location];
            UIImage *image = [UIImage imageWithData:data];
        }
    }];
    [downloadTask resume];
    
  2. 图片处理
    • 按需加载:只在需要显示图片时才加载,避免提前加载过多图片到内存。
    • 尺寸适配:根据显示图片的控件大小,对加载后的图片进行尺寸调整,减少内存占用。例如,若要在UIImageView中显示图片,可以使用如下方法调整图片大小:
    - (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)size {
        UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    
  3. 缓存机制
    • 内存缓存:可以使用NSCache来实现简单的内存缓存。在加载图片前先检查缓存中是否已有该图片,若有则直接使用缓存中的图片,避免重复加载。
    static NSCache *imageCache;
    + (void)initialize {
        if (self == [YourViewController class]) {
            imageCache = [[NSCache alloc] init];
        }
    }
    - (UIImage *)loadImageFromURL:(NSURL *)url {
        UIImage *cachedImage = [imageCache objectForKey:url];
        if (cachedImage) {
            return cachedImage;
        }
        // 这里进行正常的图片加载逻辑,加载完成后将图片存入缓存
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        [imageCache setObject:image forKey:url];
        return image;
    }
    
    • 磁盘缓存:使用第三方库如SDWebImageAFNetworking的图片加载功能,它们自带磁盘缓存机制,可以有效减少重复下载图片,降低内存峰值。