1.简述SDWebImage的实现原理
SDWebImage中为UIView提供了一个分类叫做 WebCache,这个分类同时提供了很多类似的方法,这些最终会调用一个同时具有optionProgressBlock completionBlock的方法,而这个类最终被调用的方法会首先检查是否传入了placeholderImage以及对应的参数,并设置placeholderImage。
然后,会获取SDWebImageManager中的单例调用一个downloadImageWithURL:的方法获取图片,而这个manager获取图片的过程大体上分为两部分,它首先会在SDWebImageCache中寻找图片是否有对应的缓存,它会以URL作为数据的索引先在内存中寻找是否有对应的缓存,如果缓存未命中就会在磁盘中利用MD5处理过的Key来继续查询对应的数据,如果找到了,就会把磁盘中的缓存备份到内存中。
然而,假设我们在内存和磁盘缓存中都没有命中,那么manager就会调用它特有的一个SDWebImageDownloader对象的方法downloadImageWithURL:来下载图片,这个方法会在执行的过程中调用另一个方法addProgressCallback:andCompletedBlock:forURL:createCallback:来存储下载过程中和下载完成的回调,当回调块是第一次添加的时候,方法会实例化一个NSMutableURLRequest和SDWebImageDownloaderOperation,并将后者加入Downloader持有的下载队列开始图片的异步下载。而在图片下载完成之后,就会在主线程设置image属性,完成整个图像的异步下载和配置。
2.简述XML和JSON数据各有什么优势
(1)XML更适合数据定义,数据存储。它对数据的表达使得这个数据脱离你程序的上下文仍然存在意义并且可以被解读。所以XML适合作为配置文件,以及数据存储,存盘文件格式等等。
(2)JSON更适合数据传输。JSON数据体积相对于XML小,对于传输而言,双方必然需要遵循协商好的协议,因而JSON对数据的表达并不需要在数据传输的双方以外仍然具有可解读的意义,只要传输的双方能读懂即可。
3.简述线程和进程的联系和区别
定义:
(1)进程是系统进行资源分配和调度的一个独立单位;
(2)线程是进程的实体,是CPU调度和分配的基本单位。
关系:
(1)一个线程可以创建和撤销另一个线程;
(2)同一个进程中的多个线程之间可以并发执行。
区别:
(1)一个程序至少有一个进程,一个进程至少有一个线程;
(2)线程的划分尺度小于进程,使得多线程程序的并发性高;
(3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序的运行效率;
(4)线程不能独立执行,必须依存于应用程序中,由应用程序提供多个线程执行控制;
(5)多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统不会将多线程看做多个应用,来实现进程的调度和管理及资源分配。
4.简述NSUserDefaults的使用场景和使用注意事项
NSUserDefaults支持的数据类型有:NSNumber(NSInteger/float/double)、NSString、NSData、NSArray、NSDictionary、BOOL,如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。如需数据永久保存到NSUserDefaults,只需要简单地储存成键值对,注意保存时的key的唯一性,如对相同的key复制则会覆盖以前的数据。