iOS基础知识点总结(二)

1、请简单说明多线程技术的优点和缺点?

优点

  • 能够适当提高程序的执行效率;
  • 能够适当的提高资源的利用率,比如CPU、内存。

缺点

  • 创建线程有额外开销
  • 程序的代码更加复杂
  • 线程越多,CPU在调度线程上的开销就越大
  • 如果开启大量线程,反而会降低程序的性能

2、请简单介绍下什么是原子和非原子属性?

  • atomic:原子属性,会为setter方法加锁,默认为atomic。线程安全,会消耗大量资源
  • nonatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。

3、请简单说明对图片进行二级缓存的实现思路?

在显示图片的时候

  • 1.先检查该图片对应的内存缓存
    • 1.如果存在内存缓存,则
      a.直接使用设置并显示图片;
    • 2.如果内存缓存中没有,则
      a.继续检查该图片对应的磁盘缓存是否存在,跳转到第2步。
  • 2.检查该图片对应的磁盘缓存
    • 1.如果存在磁盘缓存,则
      a.先保存一份到内存缓存中(方便下次使用)
      b.然后设置并显示图片
    • 2.如果不存在磁盘缓存,则直接下载该图片,下载完成后
      a.保存一份到内存缓存中
      b.保存一份到磁盘缓存中
      c.设置并显示图片

4、请简单说明NSCache的特点?

  • NSCache是苹果推出专门用来处理内存缓存的类
  • NSCache默认是线程安全的,在使用的时候可以不用考虑线程安全的问题
  • NSCache使用方法和可变字典类似,当缓存文件超过最大限度的时候会开启一个回收过程,把最老的缓存对象回收
  • NSCache可以设置缓存的const(成本)和缓存的数量

5、请问SDWebImage框架的框架结构是怎么样的?

SDWebImage框架有几个主要的组件:

  • 管理者(SDWebImageManager)
  • 缓存处理组件(SDImageCache)主要对下载的图片进行内存缓存和磁盘缓存处理
  • 下载处理组件(SDWebImageDownloader|SDWebImageDownloadOperation)主要处理开子线程异步发送网络请求下载图片相关操作

6、请简单说明GET请求和POST个请求有什么区别,如何选择?

  • GET请求的参数直接用&拼接并以?为分隔拼接在请求URL的后面
  • POST请求的参数是转换为二进制设置在请求体传递的
  • 如果仅仅只是索取数据获得数据,那么建议使用GET请求,其他情况则建议使用POST请求,相对而言POST请求安全性更好一些。

7、请简单列出使用NSURLConnection发送一个异步POST网络请求的步骤?

  • 1.确定请求路径(URL)
  • 2.创建可变的请求对象(NSMutableURLRequest)
  • 3.修改请求方法为POST请求
  • 4.把参数拼接起来转换为二进制数据,设置请求体
  • 5.使用NSURLConnection发送异步请求([NSURLConnection sendAsync….])
  • 6.解析服务器返回的数据,查看请求结果

8、请简单介绍下AFN各个主要版本的情况?

1
2
3
4
5
6
0.1--1.0            "2.0---2.6.3"                      3.0-->3.1.0
NSURLConnection - (NSURLConnection + NSURLSession) - NSURLSession

0.1-2.0 NSURLConnection
2.0 -3.0 NSURLSession + NSURLConnection
3.0 + NSURLSession

9、在使用NSURLSession进行文件上传的时候,如何监听文件上传的进度,有哪些注意点?

  • 创建会话对象的时候,需要设置代理,让控制器成为session的代理
  • 遵守代理协议(NSURLSessionDataDelegate)
  • 实现代理方法,在代理方法中计算文件的上传进度
    1
    2
    3
    4
    5
      - (void)URLSession:(NSURLSession *)session
    task:(NSURLSessionTask *)task
    didSendBodyData:(int64_t)bytesSent
    totalBytesSent:(int64_t)totalBytesSent
    totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend

注意:当任务执行完毕的时候应该释放对代理对象的强引用

10、在发送网络请求的时候,如果一个参数(place)需要对应着多个值,那么以下两种请求路径哪种是正确的?

1
2
3
:[http://192.168.31.520:1314/loveyou?place=Beijing&Shanghai](http://120.25.226.186:32812/weather?place=Beijing&Shanghai)

:[http://](http://120.25.226.186:32812/weather?place=Beijing&place=Shanghai)[192.168.31.520:1314](http://120.25.226.186:32812/weather?place=Beijing&Shanghai)/loveyou?place=Beijing&place=Shanghai

第二种请求路径是正确的,第一种是错误的,后面的shanghai将会被忽略