版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS开发高频面试题及详细解析(知乎干货版)适用人群:初中级iOS开发工程师、跳槽面试、校招进阶内容说明:精选一线互联网公司高频真题,涵盖Swift基础、OC与Swift混编、内存管理、RunLoop、多线程、UI渲染、性能优化、项目实战、底层原理,答案贴合面试口语作答逻辑,拒绝书面套话。一、Swift基础核心面试题(必问)1.Swift中struct和class的核心区别?开发中如何选择使用?详细答案:核心区别主要体现在存储机制、继承特性、内存管理三个核心维度:1.存储与赋值机制不同:struct是值类型,存储在栈区,赋值、传参时会完全拷贝一份新数据,新旧对象相互独立;class是引用类型,存储在堆区,赋值仅传递内存地址,多个对象指向同一块内存,修改会相互影响。2.继承特性不同:结构体不支持继承,无法创建子类;类支持单继承,可重写方法、属性,支持多态。3.内存管理不同:结构体无需手动管理内存,栈内存自动释放;类依赖ARC自动引用计数管理内存,存在循环引用风险。4.构造器规则不同:结构体默认提供逐一成员构造器;类默认无空构造器,需手动实现。使用选择原则:单纯的数据模型、静态数据、无需继承的场景优先用struct,比如普通数据模型、枚举配置;需要复用逻辑、继承扩展、共享实例的场景用class,比如页面控制器、工具类、业务管理器。2.Swift中let和var的本质区别?lazy懒加载的使用场景和注意事项?详细答案:let定义常量,初始化后值不可修改,如果是引用类型,仅不能修改地址,内部属性可修改;var定义变量,初始化后可随时修改数值和属性。lazy懒加载是延迟初始化,属性在第一次调用时才会初始化赋值,而非对象创建时初始化。使用场景:1.初始化耗时、耗资源的属性,避免对象创建时冗余消耗性能;2.属性依赖当前对象自身属性,无法在构造器中直接初始化;3.按需创建资源,减少内存占用。注意事项:1.lazy只能用于成员属性,不能用于局部变量;2.lazy属性默认是变量var,不能用let修饰;3.多线程场景下,懒加载初始化可能存在线程安全问题,需手动加锁防护。3.Swift中Optional可选类型的原理?隐式解包和强制解包的风险?详细答案:Optional是Swift的枚举类型,本质是enumOptional<T>{casenone,some(T)},用于解决变量空值问题,明确标识变量是否有值,杜绝空指针崩溃。三种解包方式及风险:1.强制解包(!):强行解析可选值,若值为nil会直接触发程序崩溃,仅能用于100%确定有值的场景,日常开发尽量避免。2.隐式解包(!声明):声明时直接解包,使用时无需手动解包,适合页面控件、初始化后必定有值的属性,若赋值前调用会崩溃。3.可选绑定/可选链:安全解包方式,有值则使用,无值则静默失效,是开发首选。二、内存管理与循环引用面试题(核心高频)1.SwiftARC内存管理原理?strong、weak、unowned区别详细答案:ARC即自动引用计数,编译器会在编译阶段自动插入retain、release、dealloc代码,通过计数管理堆内存对象,计数为0时自动释放内存,无需开发者手动管理。三者核心区别:1.strong(默认):强引用,持有对象引用,引用计数+1,只要有强引用存在,对象就不会释放,是造成循环引用的主要原因。2.weak:弱引用,不增加引用计数,不会持有对象,对象释放后指针自动置nil,安全无野指针,主要用于解决代理、闭包循环引用,只能修饰可选类型。3.unowned:无主引用,不增加引用计数,不置nil,对象释放后访问会直接崩溃,性能略高于weak,适用于生命周期完全同步、绝对不会为空的对象。2.常见的循环引用场景及解决方案?详细答案:三大常见场景:1.两个类相互强引用,A持有B,B又强引用A;2.闭包捕获当前self,闭包被当前对象强持有;3.代理属性被控制器强持有。对应解决方案:1.双向引用场景:一方用strong,另一方用weak/unowned打破闭环;2.闭包场景:使用[weakself]或[unownedself]捕获,内部判空使用;3.代理场景:代理属性统一用weak修饰,避免控制器被代理对象强持有。三、RunLoop底层与运行机制面试题1.iOSRunLoop是什么?核心作用是什么?详细答案:RunLoop是运行循环,是线程的消息循环机制,本质是一个死循环,负责监听线程的事件源(触摸、定时器、网络回调、端口消息)。核心作用:1.保持线程存活:主线程默认开启RunLoop,保证程序不退出,持续响应用户操作;2.休眠节能:无事件时线程休眠,不占用CPU资源,有事件时唤醒处理;3.调度任务:有序处理Timer、Source、Observer等各类事件,保证线程任务有序执行。子线程默认无RunLoop,执行完任务立即销毁,如需常驻子线程,需手动开启RunLoop。2.RunLoop常见应用场景?Timer不准的原因?详细答案:常用场景:常驻子线程、页面卡顿监控、滑动时定时器正常执行、线程保活、异步事件回调调度。Timer不准核心原因:1.Timer依赖RunLoop运行,RunLoop存在休眠、任务阻塞时,定时器无法及时触发;2.主线程UI渲染、大量计算、卡顿耗时操作,会抢占RunLoop资源,延迟Timer回调;3.普通Timer默认加入Default模式,页面滑动时RunLoop切换模式,定时器暂停。解决方案:将Timer添加到Common模式,适配滑动场景,或使用GCD定时器替代,GCD定时器不依赖RunLoop,精度更高。四、多线程与GCD面试题(重点)1.GCD队列和任务的区别?串行、并发、主队列区别详细答案:任务是需要执行的代码块,队列是存放任务的容器,负责调度任务执行顺序和线程分配。四种队列核心特性:1.主队列(main):串行队列,所有任务在主线程执行,负责UI刷新、页面操作,任务依次执行,不开启新线程。2.串行队列(serial):任务先进先出,依次执行,同一时间仅执行一个任务,可手动创建用于顺序执行异步任务。3.并发队列(concurrent):任务同时调度,多个任务并行执行,自动开启多条线程,执行顺序无序。4.全局队列:系统自带并发队列,分高、中、低、后台四个优先级,日常异步任务首选。2.GCD死锁产生的原因及常见场景?如何避免?详细答案:死锁本质:当前线程等待队列中未完成的任务,任务又依赖当前线程执行,相互等待导致线程卡死。最常见场景:主线程同步派发任务到主队列,即主线程sync调用主队列任务,百分百死锁。其他场景:两个串行队列相互同步等待对方任务完成。避免方案:1.主线程禁止使用sync同步派发主队列任务;2.串行队列尽量使用async异步派发;3.杜绝队列间相互嵌套同步调用。3.GCD栅栏函数、信号量的使用场景详细答案:栅栏函数(barrier):用于并发队列中,拦截前后任务,保证栅栏任务执行时,前面任务全部完成,后面任务等待栅栏任务结束再执行。主要用于多读单写场景,解决多线程数据读写冲突。信号量(semaphore):用于控制最大并发数、线程同步、异步任务顺序执行。常用场景:限制网络请求并发数量、异步任务串行执行、接口请求节流。五、UI渲染与性能优化面试题(实战必考)1.iOSUI渲染原理?图层树、渲染树、像素树区别详细答案:iOSUI渲染基于CALayer,UIView是事件响应载体,CALayer是渲染载体,所有UI绘制最终都由Layer完成。渲染流程分为三步:1.图层树(LayerTree):开发者操作的树结构,我们修改的frame、颜色、圆角、透明度都作用于此,是当前页面的图层数据模型。2.呈现树(PresentationTree):动画过程中的实时图层状态,记录动画每一帧的实时属性,解决动画过程中取值不准的问题。3.渲染树(RenderTree):底层渲染引擎生成的树结构,交由GPU渲染,开发者无法直接操作。CPU负责图层布局、文本绘制、解码,GPU负责纹理渲染、图层合成,二者协同完成UI渲染。2.页面卡顿的常见原因及优化方案?详细答案:iOS屏幕刷新帧率为60帧/秒,每帧耗时超过16ms就会出现卡顿,卡顿核心分为CPU卡顿和GPU卡顿。CPU卡顿原因及优化:1.主线程大量计算、数据解析、文件读写:将耗时操作移至子线程异步处理;2.视图频繁创建、销毁、布局计算:复用Cell、视图缓存,减少动态布局计算;3.大量日志打印、冗余代码:上线屏蔽无用打印,精简主线程逻辑。GPU卡顿原因及优化:1.图层过多、过度渲染:减少无用图层,合并重叠视图;2.圆角、阴影、遮罩离屏渲染:尽量用贝塞尔曲线预渲染,避免实时裁剪;3.图片过大、未解压:使用适配尺寸图片,提前解压缓存。3.离屏渲染是什么?哪些操作会触发?如何优化?详细答案:正常渲染是GPU在当前屏幕缓冲区直接渲染,离屏渲染是GPU需要开辟新的临时缓冲区,先渲染再合成到屏幕,耗时极高,是页面卡顿的重要原因。触发离屏渲染的常见操作:设置圆角+裁剪、阴影、mask遮罩、group透明度、图层混合模式。优化方案:1.静态视图提前用绘图代码绘制圆角、阴影,避免实时渲染;2.尽量避免同时开启圆角裁剪和阴影;3.使用预渲染图片替代实时图层渲染;4.关闭不必要的图层透明通道。六、项目实战与常见问题面试题1.App启动优化怎么做?启动时间分为哪几个阶段?详细答案:启动分为三个阶段:1.pre-main阶段:系统加载可执行文件、动态库、绑定符号、初始化runtime,开发者可优化空间有限;2.main阶段:main函数开始到AppDelegate执行完毕;3.首屏渲染阶段:页面初始化、布局、数据加载、渲染完成。核心优化方案:1.删减无用动态库、冗余第三方库,减少系统加载耗时;2.main阶段避免主线程耗时操作,第三方SDK延迟初始化、懒加载;3.首屏按需加载,非首屏业务、数据、视图延迟加载;4.优化图片资源,压缩首屏图片,避免大图渲染耗时;5.精简AppDelegate和根控制器冗余逻辑。2.如何处理TableView滑动卡顿、复用异常问题?详细答案:卡顿优化:1.高度预计算:提前计算Cell高度并缓存,避免滑动时实时计算;2.减少Cell内部子视图层级,避免嵌套过多视图;3.图片异步加载、缓存,滑动时停止网络请求,减速后恢复;4.避免Cell内部圆角、阴影等离屏渲染操作。复用异常解决:Cell复用会导致旧数据残留,核心解决方式是在prepareForReuse中重置控件状态,清空文本、图片、选中状态、隐藏属性,保证复用后状态纯净。3.Swift与OC混编注意事项?详细答案:1.OC调用Swift:需配置Target-Swift.h头文件,Swift类需继承NSObject、添加@objc修饰,方法属性对OC可见;2.Swift调用OC:直接引入OC桥接头文件,无需额外配置;3.枚举、结构体对OC不兼容,混编场景优先用类实现;4.Swift可选类型需做好判空,避免OC传空值导致崩溃;5.宏定义、静态常量在Swift中需重新封装适配。七、崩溃与异常排查面试题1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于最大熵分布的海洋平台环境条件联合重现值推算研究
- 基于智能算法与仿真分析的机车车顶天线布局优化研究
- 基于时空知识可视化的中国自然疫源性疾病特征与防控策略研究
- T∕CECS 486-2017 数据中心供配电设计规程
- 江苏银行蓝色微立体幻灯片模板
- 2026年牡丹江市检察官逐级遴选笔试题目及答案
- 2026年处方药与非处方药流通管理暂行规定培训试题(含答案)
- 2026年手术室护理质量专题试题及答案
- 2026年陕西省渭南市辅警人员招聘考试题库及答案
- 2026年肛裂的中医护理试题及答案
- 新疆维吾尔自治区初中级档案职称考试(档案基础)手机备考题库及答案(2026年)
- 肿瘤心理干预沟通护理课件
- 2026年校招:中国银行试题及答案
- 2026年物业管理条例考核试题及答案
- 公共娱乐场所电气消防安全培训
- 2026秋新版道德与法治五年级上册教学课件:第七课第1课时 社会主义好-自力更生结硕果 有多个微课视频
- 第5课 中国人民站起来了 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 制造业公司绩效考核含全套KPI指标库
- 2026年《资料员》考试题库带答案(考试直接用)
- 水利水电工程基坑临边防护专项方案
- 2026年浙江省绍兴市越城区网格员招录真题(含答案)
评论
0/150
提交评论