请描述一下SDWebImage内部实现的原理
答:
SDWebImage底层实现有沙盒缓存机制,主要由三块组成
1、内存图片缓存
2、内存操作缓存
3、磁盘沙盒缓存
KVO的实现原理?
答:KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制。
如何给一个对象的私有属性赋值?
答:利用KVC即键值编码来给对象的私有属性赋值.
block的本质是什么?为啥在block里面更改外面变量的值,要给外面的变量加_block修饰,加_block修饰的原理是什么?
答:
(1) block本质是一个数据类型,多用于参数传递,代替代理方法, (有多个参数需要传递或者多个代理方法需要实现还是推荐使用代理方法),少用于当做返回值传递. block是一个OC对象,它的功能是保存代码片段,预先准备好代码,并在需要的时候执行.
(2)因为使用block代码块可能会引起内部循坏引用,所以应在block定义前加上修饰
block在哪种情况下会造成循环引用,如何解决?
答:
(1)从两方面分析造成循环引用问题
当self拥有一个block的时候,在block又调用self的方法(或者self所拥有的某个属性)。形成你中有我,我中有你,这种时候会造成循环引用
把某个实例变量变成本地临时变量,强引用将直接指向这个本地临时变量,但本地临时变量一般都会很快释放,所以一般考虑第一种情况
(2)解决方案:对block进行修饰__weak(arc)或__block(mrc)
NSURLSession在什么情况下回存在循环引用的问题,怎么解决?
答:
(1)在使用NSURLSession签订其代理的时候会存在循环引用问题,因为其代理是retain强引用
(2)解决方案
-----(1)在下载完成后取消NSURLSession会话并释放Session,赋值为nil。
-----(2)再视图将要消失时也执行同样的操作。为了防止没有下载完成就跳转控制器。
具体如下:
/**视图将要消失的时候,取消session*/
- (void)viewWillDisappear:(BOOL)animated {
[superviewWillDisappear:animated];
//任务完成,取消NSURLSession
[self.sessioninvalidateAndCancel];
//释放会话
self.session =nil;
}
如何自己实现GET缓存?
答:
1.使用GET请求数据
2.iOS系统SDK已经做好了缓存。需要的仅仅是设置下内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];