iOS阿里大厂面试题(二)

64 阅读6分钟

没时间从来都不是借口 。老话常说,时间就像海绵,挤一挤总会有的。如果永远拿时间当借口,没时间去学习,你就永远在原地踏步。但是你不进步,时代进步,换而言之你就是在退步,学如逆水行舟,不进则退。废话不多说,接下来分享今天的一个面试知识点。基础但有用,希望可以帮到各位读者。

多线程有哪几种?你更倾向哪一种? 首先多线程的一个分类和特点。 *1.pthread 1) 一套通用的多线程API 2) 适用于Unix\Linux\Windows等系统 *3)*可跨平台 可移植 *4)*使用难度大 *5)*实用语言为C语言 *6)*使用频率:几乎不使用 *7)*线程生命周期:有开发者管理 2.NSThread *1)*面向对象 *2)*简单易用,可以直接操作线程 *3)*使用语言 OC语言 *4)*使用频率 偶尔使用 *5)*线程生命周期:有开发者管理 3.Gcd *1)*替换NSThread等线程技术 *2)*充分利用了设备多核(自动)*3)*使用语言:c语言 4) 使用频率:经常使用 *5)*线程生命周期 :自动管理 4.NSOperation 1)基于GCD(底层是GCD) 2)比GCD多了一些更简单实用的功能 3)使用更加面向对象 4)使用语言:OC语言 5)使用频率:经常使用 6)线程生命周期:自动管理

多线程的原理? 多线程的原理:同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)如果CPU调度线程的时间够快,就造成了多线程并发执行的假象思考:如果线程非常非常多,会发生什么情况?CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源每条线程被调度执行的频次会降低(线程的执行效率低) 多线程的优点:能适当提高程序的执行效率能适当提高资源利用率(CPU、内存利用率) 多线程的缺点:线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能线程越多,CPU在调度线程上的开销就越大程序设计就会更加复杂:比如线程之间的通信、多线程的数据共享。

你更倾向于哪一种?倾向于GCD GCD技术是一个轻量的,底层实现隐藏的神奇技术,我们能够通过GCD和block轻松实现多线程编辑,有时候,GCD相比其他系统提供的多线程方法更加有效,当然,有时候GCD不是最佳选择,另一个多线程编辑的技术NSOprationQueue让我们能够将后台线程以队列方式依序执行,并提供更多操作的入口,这和GCD的实现有些类似。这种类似不是一个巧合,在早期,MacOX与iOS的程序普遍采用Operation Queue来进行编写后台线程代码,而之后出现的GCD技术大体是依照前者的原则来实现的,而随着GCD的普及,在iOS4与MacOSX10.6以后,Operation Queue的底层实现都是用GCD来实现的

那这两者之间有什么区别呢? 1.GCD是底层C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多选择; 2.在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入Queue的biock(其实是有的,但需要许多复杂的代码); 3.NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并列队列中,但前者会直到后者执行完毕后在执行; 4.我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌握我们执行的后台任务。 5.在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码; 6.我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。总的来说,Operation queue提供了更多你在编写多线程程序时需要的功能,并隐藏了许多线程调度,线程取消与线程优先级的复杂代码,为我们提供简单的API入口。从编程原则来说,一般我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。但是我认为当时我们的需求能够以更简单的底层代码完成的时候,简洁的GCD或许是个更好的选择,而Operation queue为我们提供更多选择。

你更倾向于哪一种?倾向于NSOperation 1.NSOperation拥有更多的函数可用,具体查看api。NSOperationQueue是在GCD基础上实现的,只不过是GCD更高一层的抽象 2.在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。 3.NSOperationQueue支持KVO。可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld) 4.GCD只支持FIFO的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。 使用NSOperation的情况:各个操作之间有依赖关系、操作需要取消暂停、并发管理、控制操作之间优先级,限制同时能执行的线程数量。让线程在某时刻停止/继续等 使用GCD的情况;一般的需求很简单的多线程操作,用GCD都可以了,简单高效。从编程原则来说,一般我们需要尽可能的使用高等级、封装完美的API,在必须时才使用底层API。当需求简单,简洁的GCD或许是个更好的选择,而Operation queue能为我们提供恨过的选择。 今天的分享就到这里了 希望能对各位客官有帮助 如果哪里有错误的话 海清在评论区指正 谢谢 记得点上一点免费的小星星哦 ————————————————