版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS多线程高频面试题及详细答案(实战版)本文整理iOS开发面试中最高频、最实用的多线程题目,全部答案基于日常开发实战+大厂面试标准,无空洞理论,贴合真实面试问答场景一、基础认知类1.iOS中有哪几种多线程方案?各自的优缺点和使用场景?iOS主流多线程方案有四种:pthread、NSThread、GCD、NSOperation,层级从底层到高层封装,开发中常用后两种。1.pthread(C语言底层)优点:跨平台、轻量级,系统原生底层接口。缺点:纯C函数,手动管理线程生命周期(创建、销毁、休眠),代码繁琐,不面向对象,极易内存泄漏。使用场景:几乎不用在业务开发,仅底层框架、内核级开发会用到。2.NSThread(OC面向对象)优点:面向对象封装,使用简单,可直接获取线程对象、控制线程启停。缺点:依然需要手动管理线程生命周期,线程复用差、创建开销大,数量过多会造成性能卡顿。使用场景:简单的单次子线程任务,极少用于批量并发任务。3.GCD(系统自动管理)优点:C语言接口,执行效率高、开销小,系统自动管理线程池、线程复用,支持并发、串行、延时、栅栏、组任务等丰富功能,是日常开发主流方案。缺点:任务依赖、复杂任务优先级控制不如NSOperation灵活,无现成的任务暂停、取消接口。使用场景:绝大多数异步任务、网络请求、数据解析、UI刷新、批量并发任务。4.NSOperation+NSOperationQueue优点:基于GCD封装,面向对象,支持任务暂停、取消、重启、优先级设置、任务依赖关系,可精准控制任务执行顺序。缺点:封装层级高,少量简单任务使用会略显冗余。使用场景:批量下载、上传、多任务有序执行、需要取消/暂停的复杂业务任务。2.进程和线程的区别?1.进程:系统资源分配的最小单位,每个进程独立占用内存、CPU资源,进程之间完全隔离,互不干扰,开销极大。一个App就是一个进程。2.线程:CPU调度的最小单位,依附于进程存在,一个进程包含多条线程,同一进程内的线程共享内存、资源,线程切换开销极小。核心总结:进程是资源单位,线程是执行单位;进程独立隔离,线程共享资源。3.主线程和子线程的区别?开发中的硬性规范?1.主线程(UI线程):App启动默认创建,负责所有UI渲染、界面交互、事件响应,优先级最高。主线程阻塞会直接造成页面卡顿、ANR、黑屏。2.子线程:专门处理耗时任务,不影响UI刷新,优先级低于主线程,系统灵活调度。开发铁规:所有UI操作必须在主线程执行,所有耗时操作(网络、文件、数据库、大图解析)必须放在子线程。二、GCD核心面试题(重中之重)1.GCD队列和任务的区别?串行、并发队列的核心差异?任务:需要执行的代码块(block),分为同步任务sync、异步任务async。队列:存放任务的容器,遵循FIFO先进先出原则,负责调度任务执行。串行队列(Serial)一次只执行一个任务,必须等上一个任务执行完毕,才会执行下一个任务,任务有序执行。并发队列(Concurrent)同一时间可以调度多个任务同时执行,无需等待上一个任务结束,任务无序执行(取决于系统调度),但依旧遵循FIFO取任务的规则。2.GCD同步、异步任务的区别?是否开启新线程?1.同步任务sync:不会开启新线程,在当前线程执行任务,执行过程会阻塞当前线程,必须等待任务完成,代码才会继续往下走。2.异步任务async:会开启新线程(主线程队列除外),不会阻塞当前线程,代码无需等待任务完成,直接向下执行。核心组合结论(面试必背):-主队列+同步任务:死锁-主队列+异步任务:主线程执行,不开启新线程-串行队列+同步任务:当前线程执行,不开启新线程,阻塞-串行队列+异步任务:开启1条子线程,任务串行执行-并发队列+同步任务:当前线程执行,不开启新线程,阻塞-并发队列+异步任务:开启多条子线程,任务并发执行3.什么是GCD死锁?常见死锁场景和原理?如何避免?死锁核心原理:当前队列正在等待任务执行完成,而需要执行的任务又放在了当前队列,互相等待、互相阻塞,导致线程永久卡死。最常见死锁场景1.主线程中调用dispatch_sync执行主队列任务:主线程正在运行代码,同步阻塞等待任务完成,而任务需要主线程空闲才能执行,双向等待触发死锁。2.同一串行队列嵌套同步任务:外层同步任务占用队列,内层同步任务等待队列空闲,互相阻塞死锁。避免方案1.主线程刷新UI永远用异步dispatch_async;2.禁止在同一串行队列中嵌套同步任务;3.嵌套任务使用异步执行,或切换不同队列。4.GCD栅栏函数(barrier)作用及使用场景?栅栏函数分dispatch_barrier_async和dispatch_barrier_sync,核心作用是拦截队列任务,保证栅栏前的任务全部执行完毕,再执行栅栏任务,最后执行栅栏后的任务。注意:栅栏函数仅对自定义并发队列生效,对主队列、全局并发队列无效。使用场景:最经典的多读单写场景。大量读操作可以并发执行,写操作需要单独执行,读写互斥、写写互斥,保证数据线程安全。5.GCD延时函数dispatch_after的原理?有什么坑?原理:dispatch_after不是精准的定时触发,是将任务添加到队列的延时时间,而非任务执行时间。时间到了之后,任务会进入队列排队,等待系统调度执行。常见坑:1.队列任务拥堵时,延时任务会滞后执行,时间不精准;2.页面退出后,延时任务依然会执行,容易造成野指针、界面刷新异常、内存泄漏;解决方案:页面销毁时,手动取消延时任务,或使用可取消的定时器替代。6.GCD队列组dispatch_group作用?常用场景?队列组可以监听多个异步任务的执行状态,实现多任务并发执行,全部完成后统一回调的效果。核心API:group_enter(入组)、group_leave(出组)、group_notify(全部完成回调)、group_wait(阻塞等待全部完成)。使用场景:1.多个独立网络请求并发执行,全部成功后再刷新页面;2.多文件、多数据批量解析完成后统一处理;3.需要等待多个异步任务结束后执行后续逻辑的场景。三、NSOperation面试题1.NSOperation对比GCD的优势?1.支持任务暂停、取消、重启,GCD无原生暂停取消能力;2.支持任务依赖,可以精准控制任务执行先后顺序,GCD实现依赖逻辑非常繁琐;3.支持任务优先级设置,可自定义任务执行权重;4.面向对象,可继承自定义任务,封装性更强,适合复杂业务。2.NSOperation的依赖关系原理?有什么注意点?可以给任务A添加依赖任务B,系统会保证B执行完成后,才会执行A,支持多依赖、链式依赖。注意点:1.绝对不能出现循环依赖(A依赖B,B依赖A),会导致任务永久不执行;2.依赖仅控制执行顺序,不区分队列,不同队列的任务也可以设置依赖;3.任务取消后,依赖关系依然生效,需手动处理状态。3.NSOperationQueue最大并发数作用?maxConcurrentOperationCount用于设置队列同时执行的最大任务数量。-默认-1:不限制并发,系统自动调度;-设置为1:等价于串行队列,任务逐个执行;-设置大于1:限定同时执行的任务数,避免并发任务过多导致CPU飙升、卡顿。实战场景:批量图片下载、文件上传,设置最大并发数,防止同时发起过多请求导致崩溃。四、线程安全与锁机制(高频难点)1.什么是线程不安全?iOS中常见线程不安全场景?多个线程同时操作同一资源(读、写、修改),没有加锁保护,会造成数据错乱、数据覆盖、崩溃,就是线程不安全。常见场景:1.多线程同时修改可变数组、可变字典;2.多线程同时读写同一全局变量、属性;3.网络回调多线程同时刷新同一数据模型。核心结论:可变对象线程不安全,不可变对象线程安全。2.iOS常用锁的种类、优缺点、性能对比?1.@synchronized(互斥锁)优点:使用最简单,一行代码搞定,自动加锁解锁,无需手动管理。缺点:性能最差,底层需要大量逻辑判断,递归、频繁加锁场景效率低。场景:简单、低频的读写保护。2.NSLock(普通互斥锁)优点:性能优于@synchronized,使用灵活。缺点:不支持递归加锁,同一线程重复加锁会死锁。3.NSRecursiveLock(递归锁)优点:支持同一线程递归加锁,不会死锁,适合递归方法。缺点:性能略低于普通锁。4.pthread_mutex(底层C锁)优点:性能极高,轻量级,支持互斥、递归、读写锁。缺点:C语言接口,需要手动初始化、销毁,代码繁琐。5.信号量dispatch_semaphore优点:GCD原生,性能极佳,可控制最大并发数、实现线程阻塞、读写保护。场景:控制接口并发请求数量、线程同步、数据安全保护。性能排序:信号量>pthread_mutex>NSLock>@synchronized3.atomic和nonatomic的区别?是否绝对线程安全?1.atomic:系统默认,对属性的读写操作加锁,保证单条读写操作线程安全,性能低。2.nonatomic:不加锁,读写效率高,日常开发全部使用。重点面试答案:atomic不是绝对线程安全!atomic仅保证单次读/写操作安全,无法保证多次读写、赋值逻辑、业务逻辑的线程安全。比如多线程同时先读再写,依然会出现数据错乱,只能靠锁解决。五、经典面试代码题(必考)1.说出下面代码的执行顺序、打印结果PlainText
dispatch_queue_tqueue=dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL);
NSLog(@"start");
dispatch_async(queue,^{
NSLog(@"async1");
dispatch_sync(queue,^{
NSLog(@"sync");
});
NSLog(@"async2");
});
NSLog(@"end");答案:死锁崩溃解析:自定义串行队列,异步任务进入队列执行async1,此时队列被占用。内部嵌套同步任务,需要等待当前队列空闲才能执行,而当前队列正在执行外层任务,互相等待,触发死锁。2.子线程能否刷新UI?为什么?可以刷新,但不允许、不推荐。底层原理:UIKit组件不是线程安全的,子线程刷新UI大概率不会立即崩溃,但会出现界面错乱、渲染异常、布局错乱、偶现闪退等隐性问题。iOS系统对主线程UI渲染做了优化,所有UI绘制、布局、刷新逻辑,必须在主线程执行,是系统强制规范。3.多线程如何实现单例线程安全?日常开发最优方案:GCD一次性函数dispatch_oncedispatch_once底层自带线程安全、锁保护,无论多线程同时调用,代码块只会执行一次,效率最高、代码最简,是iOS单例标准
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金色中国风春节活动策划模板
- 2026年浙江省杭州市辅警招聘考试题库 (答案+解析)
- 2026年医务人员的职业道德与行为规范培训试题(+答案)
- 2026年山东省德州市教师职称考试(理论知识)在线模拟题库及答案
- 2026年度继续教育公需科目(心理健康与职业发展)考试试题及参考答案
- 2026上教师资格笔试考试试题与答案(小学综合素质考生回忆版)
- 2026年大同市事业单位工勤技能考试考试题库及答案
- 创新原理马工程管理学第十五章
- 2026年固体废物污染环境防治法试题及答案
- 公务员考前冲刺试题+公务员考前速记知识要点(2026年吉林通化市)
- 数学等量代换
- 2026年国家能源集团笔试试题题库答案
- 云南财经大学本科学生专业分流实施细则(修订)
- 《室内空间设计(AI赋能版)》全套教学课件
- 2026年全民反诈在行动集中宣传月:被诈骗后如何维权课件
- 2025年医院感控科专职人员考核试题及答案
- 2026年山东名校考试联盟5月联考(核心素养评估)英语试题(含答案)
- 2026年中耳炎(术后)出院耳部护理与防复发
- 2025年重庆市从“五方面人员”中选拔乡镇领导班子成员考试历年参考题库含答案详解
- 2024妇科盆底重建手术加速康复的中国专家共识课件
- 浙江省财开集团有限公司2026年招聘笔试题库
评论
0/150
提交评论