以下是一些自己收集的比较基础的问题(大神可以忽略),附上答案,方便大家阅读。俗话说得好,基础不牢,地动山摇。文章末尾会提供PDF版的文档,方便大家木有网的时候也可以用移动设备观看。
iOS基础问答面试题连载(一)-附答案
iOS基础问答面试题连载(二)-附答案
iOS基础问答面试题连载(三)-附答案
iOS基础问答面试题连载(四)
这次的问题是网络多线程相关的哟,面试的时候也是必问的,大家多看看。
1.请简单说明多线程技术的优点和缺点?
优点:
能够适当提高程序的执行效率;
能够适当的提高资源的利用率,比如CPU、内存。
缺点:
创建线程有额外开销
程序的代码更加复杂
线程越多,CPU在调度线程上的开销就越大
如果开启大量线程,反而会降低程序的性能
2.请简单说明线程和进程,以及他们之间的关系?
进程是CPU调度和分配资源的单位。
线程是CPU调用的最小单位
关系:
3.请简单说明在iOS开发中有哪些多线程的实现方案?
PThread
NSThread
**
NSOperation
4.请简单说明主线程的作用,以及使用注意点?
主线程:默认启动的线程
作用:
显示和刷新UI界面
处理UI事件
注意点:
不要将耗时操作放在主线程中执行
UI操作必须在主线程中执行 !!!!
5.请简单列出NSThread线程的几种状态,并说明状态转换的逻辑?
6.请简单说明如何简单的解决多线程访问同一块资源造成的线程安全的问题,以及注意点?
加同步(互斥)锁
@synchronized
OC中的同步锁:(锁对象) {要锁住的代码}
锁对象:要求是全局唯一的属性
注意点:
要注意加锁的位置
加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源)
专业术语:线程同步
7.请简单介绍下什么是原子和非原子属性?
8.请简单介绍下**这门技术?
9.请简单介绍**中的几种队列?(4种)
10.如果当前有多个任务,这些任务都需要开子线程执行,而多个任务之间有一定的依赖关系,如果使用**来实现请试着给出一些解决方案。
11.请简单说明单例模式的特点(作用)?
12.请简单介绍操作队列?
操作队列本身是OC语言的,在iOS开发中可以用来实现多线程编程
操作队列有两大核心的概念,一个是操作(NSOperation),一个是队列(NSOperationQueue),操作用来封装任务,队列用来存放操作
要使用操作队列进行多线程编程,只需要把封装好的操作提交到相应的队列中即可,系统内部会视情况自动开启相应的线程来执行任务
在操作队列这门技术中,系统提供了两个子类可以来封装任务,一个是NSInvocationOperation,一个是NSBlockOperation,除此之外也可以直接自定义操作
操作队列中有两种队列,一种是通过[NSOperationQueue mainQueue]获得的主队列,一种是通过[[NSOperationQueue alloc]init]方法获得的非主队列
主队列是和主线程相关的串行队列,提交到主队列中的操作将被安排在主线程中执行(可以利用该特性来处理线程间通信的相关逻辑)
操作 队列:
NSInvocationOperation
NSBlockOperatio
自己创建 [[NSOperationQueue alloc]init];
主队列 [NSOperationQueue main];
13.如果有多个操作如何来设置依赖关系,如何禁用词语到某个操作执行完毕事件?
设置依赖关系:假设有有两个操作分别是op1和op2,op1需要依赖于op2,那么只需要使用[op1 addDependency:op2]方法设置即可。
操作依赖补充:使用操作队列可以方便的指定多个操作间的依赖关系,甚至可以实现跨队列的操作依赖,但是在使用的时候需要注意操作之间不能有循环依赖关系
操作禁用词语:可以使用^completionBlock来实现操作禁用词语
14.请简单比较**中的全局并发队列和使用dispatch_queue_create函数创建的并发队列异同?
全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级、默认优先级、低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。而Create函数是实打实的从头开始去创建一个队列。
在iOS6.0之前,在**中凡是使用了带Create和retain的函数在最后都需要做一次release操作。而主队列和全局并发队列不需要我们手动release。当然了,在iOS6.0之后**已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待**就OK。
在使用栅栏函数的时候,栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效
其它区别涉及到XNU内核的系统级线程编程,不一一列举。
15.请简单说明对图片进行二级缓存的实现思路?
在显示图片的时候
1)先检查该图片对应的内存缓存
a.直接使用设置并显示图片;
a.继续检查该图片对应的磁盘缓存是否存在,跳转到第2步。
2)检查该图片对应的磁盘缓存
a.先保存一份到内存缓存中(方便下次使用)
b.然后设置并显示图片
2.如果不存在磁盘缓存,则直接下载该图片,下载完成后
保存一份到内存缓存中
保存一份到磁盘缓存中
设置并显示图片
16.请简单对比下**和NSOperation两种多线程的实现方案?
**是纯C语言的API,而操作队列则是Object-C的对象。
在**中,任务用块(block)来表示,而块是个轻量级的数据结构;相反操作队列中的『操作』NSOperation则是个更加重量级的Object-C对象。
具体该使用**还是使用NSOperation需要看具体的情况,如果只是想简单开一个子线程执行任务推荐使用**,如果有很多任务需要开多个子线程下载推荐使用操作队列
17.请按照自己的理解,说一说在进行多线程编程的时候相对于**而言,操作队列有哪些优势?
NSOperation和NSOperationQueue的好处有:
NSOperationQueue可以方便的调用cancel方法来取消某个操作,而**中的任务是无法被取消的(安排好任务之后就不管了)。
NSOperation可以方便的指定操作间的依赖关系。
NSOperation可以通过KVO提供对NSOperation对象的精细控制(如禁用词语当前操作是否被取消或是否已经完成等)
NSOperation可以方便的指定操作优先级。操作优先级表示此操作与队列中其它操作之间的优先关系,优先级高的操作先执行,优先级低的后执行。
通过自定义NSOperation的子类可以实现操作重用
18.请谈一谈,自定义操作的好处?
19.请简单介绍**中的一次性代码?
一次性代码:
static dispatch_once_t onceToken;
dispatch_once( |