2018面试题整理

1. runtimerunloop的区别
1.1 runtime
1.2 runloop相关
2. SDWebImage相关
2.1 查找url对应的图片缓存是否存在
2.2 TableViewCell复用加载图片的处理
2.3 针对同一图片链接的不同图片的处理
3. AFNetworking2.0和3.0的区别

runtimerunloop的区别

runtime

  1. 动态添加对象的成员变量和方法。
  2. 获取某个类的成员变量和方法。
  3. 为类别添加属性

runloop

基本作用

  1. 保持程序的持续运行。
  2. 处理App中的各类事件(触摸事件、定时器事件等)
  3. 节省CPU资源,提高程序性能(没有事件时就进入睡眠状态)

内部实现

do-while循环,在这个循环内不断地处理各种任务

注意

一个线程对应一个runloop,采用字典存储,线程号为key,runloop为value;

主线程的runloop默认已经启动,子线程的runloop需要手动启动。

runloop在第一次获取时创建,在线程结束时销毁。

SDWebImage相关

查找url对应的图片缓存是否存在

UIImage *defaultImg = [UIImage imageNamed:@"defaultimage"];
NSString *urlStr = @"http://n.sinaimg.cn/edu/transform/20160505/pe7k-fxryhhu2274915.png";
//查找对应的图片缓存,key为url
UIImage *originalImg = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:urlStr];
if (originalImg) {
    imgView.image = originalImg;
} else {
    [imgView sd_setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:defaultImg];
}

TableViewCell复用加载图片的处理

由于cell的复用机制,在我们加载一个cell的时候,ImageView数据源开启一个下载任务并返回一个Image,当cell重用时,其数据源又会开启一个下载任务下载新的Image,但关联的对象是同一个imageView,这个时候直接setImage就会发生错乱。

SDWebImage的处理是:

  1. imageView对象会关联一个下载列表(列表是给AnimationImages用的,这个时候会下载多张图片)。当tableView滑动,imageView重设数据源(url)时,会cancel掉下载列表中所有的任务,然后开启一个新的下载任务。这样就保证了只有当前课件的cell对象的imageView对象关联的下载任务能够回调,不会发生image错乱。
  2. 同时,SDWebImage管理了一个全局下载队列(在DownloadManager中),并发量设置为6。也就是说如果可见cell的数目大于6,就会有部分下载队列处于等待状态。而且,在添加下载任务到全局的下载队列中去的时候,SDWebImage默认是采取LIFO(last in,first out)策略的,具体是在添加下载任务的时候,将上次添加的下载任务添加依赖为新添加的下载任务。

针对同一图片链接的不同图片的处理

很多App里面用户头像的url用的都是同一个,所以可能就导致明明已经更新了头像,但是显示的图片还是原来的,这是因为修改头像后,图片的url是不变的,而默认情况下,SDWebImage对相同的url是优先使用缓存的,因此得加option设置。

[_userFaceLogo sd_setImageWithURL:[NSURL URLWithString:userDto.userImgUrl] placeholderImage:[UIImage imageNamed:@"head portrait"] options:SDWebImageRefreshCached];

SDWebImageRefreshCached是专门用来处理相同url,图片不同的情况的。

AFNetworking2.0和3.0的区别

3.0之前,底层是通过NSURLConnection来实现的。在3.0之后,也就是在iOS9之后,苹果使用NSURLSession来管理网络请求,弃用了NSURLConnection.

原文地址:https://www.cnblogs.com/wuotto/p/9805004.html