2018面试题整理
1. runtime
和runloop
的区别
1.1 runtime
1.2 runloop
相关
2. SDWebImage
相关
2.1 查找url对应的图片缓存是否存在
2.2 TableViewCell
复用加载图片的处理
2.3 针对同一图片链接的不同图片的处理
3. AFNetworking
2.0和3.0的区别
runtime
和runloop
的区别
runtime
- 动态添加对象的成员变量和方法。
- 获取某个类的成员变量和方法。
- 为类别添加属性
runloop
基本作用
- 保持程序的持续运行。
- 处理
App
中的各类事件(触摸事件、定时器事件等) - 节省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
的处理是:
- imageView对象会关联一个下载列表(列表是给AnimationImages用的,这个时候会下载多张图片)。当tableView滑动,imageView重设数据源(url)时,会cancel掉下载列表中所有的任务,然后开启一个新的下载任务。这样就保证了只有当前课件的cell对象的imageView对象关联的下载任务能够回调,不会发生image错乱。
- 同时,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,图片不同的情况的。
AFNetworking
2.0和3.0的区别
在3.0
之前,底层是通过NSURLConnection
来实现的。在3.0
之后,也就是在iOS9
之后,苹果使用NSURLSession
来管理网络请求,弃用了NSURLConnection
.