面试题:你理解的多线程?
面试题:iOS的多线程方案有哪几种?你更倾向于哪一种?
面试题:你在项目中用过GCD吗?
GCD常见用法和应用场景:
1.开启一个异步的网络请求,待数据返回后返回主队列刷新UI;又比如请求图片,待图片返回刷新UI等等。
2.提供了一个简单的延迟执行的方式,比如在view加载结束延迟执行一个动画等等。
3.可以使用其创建一个单例,也可以做一些其他只执行一次的代码。
4.可以适用于自己维护的一些异步任务的同步问题
面试题:GCD的队列类型?
并发队列、串行队列。
面试题:说一下OperationQueue和GCD的区别,以及各自的优势
1、GCD的核心是C语言写的系统服务,执行和操作简单高效,因此NSOperation底层也通过GCD实现,换个说法就是NSOperation是对GCD更高层次的抽象,这是它们之间最本质的区别。因此如果希望自定义任务,建议使用NSOperation;
2、依赖关系,NSOperation可以设置两个NSOperation之间的依赖,第二个任务会在第一个任务完成后再执行,但是GCD无法设置依赖关系,不过可以通过dispatch_barrier_async来实现这种效果;
3、通过KVO(键值观察)的方式,在NSOperation中很容易判断Operation当前的状态(是否执行、是否取消等),但是GCD无法通过KVO进行判断;
4、优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,无法在执行的block设置优先级;
5、继承性,NSOperation是一个抽象类,实际开发中常用的两个类是NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation,GCD执行任务可以自由组装,没有继承那么高的代码复用度;
6、效率,直接使用GCD效率确实会更高效,NSOperation会多一些开销,但是通过NSOperation可以获得“依赖”、“优先级”、“继承”、“键值对观察”这些优势,虽然多了一些开销但是在实际开发中效益率很大。
面试题:线程安全的处理手段有哪些?
使用线程同步技术(同步,就是协同步调,按预定的先后次序进行运行)
常见的线程同步技术:加锁
面试题:OC你了解的锁有哪些?在你回答基础上进行2次提问?
追问1:自旋和互斥对比?
自旋锁、互斥锁比较
什么时候使用自旋锁比较好?
预计线程等待锁的时间很短;
加锁的代码(临界区(lock与unlock之间))经常被调用,但竞争情况很少发生;
CPU资源不紧张;
多核处理器;
什么时候使用互斥锁比较好?
预计线程等待锁的时间较长;
单核处理器;
临界区有IO操作(文件操作);
临界区代码复制或者循环量大;
临界区竞争非常激烈;
追问2:使用以上锁需要注意哪些?
追问3:用C/OC/C++,任选其一,实现自旋或互斥?口述即可!
面试题:下面代码打印结果?
显然打印为:1 3
原因是:[self performSelector:@selector(test) withObject:nil afterDelay:.0];的本质是往RunLoop中添加定时器,而子线程默认没有启动runLoop。所以需要手动启动:
打印:132
其中addPort:这一句代码可以不要,原因是上面performSelector:已经添加到timer,而线程不会死的要素是里面有timer或者source任务去等待它执行。
[self performSelector:@selector(test) withObject:nil]跟它是不一样的,没有关系到RunLoop,如果它不启动照常打印。
面试题:请问下面的代码打印结果是什么?
执行结果:打印1,并报错。
分析:在同一子线程打印1和执行下面的performSelector:方法, 当启动start线程的时候,打印1,然后block中的方法执行完,就代表任务执行完成,线程就会退出,这是再执行test显然就会报错,目标线程找不到。优化:
打印:12