iOS开发工程师面试题及答题要点
iOS工程师(也叫苹果开发、iOS开发)的面试通常2-4轮:一轮技术基础、一轮项目深挖、可能加一轮算法或系统设计,最后是HR面。最容易挂的不是基础题,而是项目深挖环节——简历上写了什么,面试官就会顺着问到底,答不出实现细节直接出局。
语言基础(Swift / Objective-C)
Swift 和 Objective-C 你都用过吗?项目里怎么选型的?
考察点:考察是否有双语言实战经验,以及技术选型是否有依据而非跟风。
- 先说结论:主力用什么、旧代码维护用什么,别含糊说「都会」。
- 给出选型理由,如新模块用Swift、存量OC代码渐进迁移,说明混编的桥接成本。
- 提一个实际踩过的坑,如Swift调OC的空值处理或混编编译速度问题。
- 如果只用过一种,坦诚说明,并讲你了解另一种的哪些机制。
别踩:只背语言优劣对比表,说不出自己项目里的真实选型过程。
讲讲 Swift 的值类型和引用类型,什么时候用 struct 什么时候用 class?
考察点:考察对Swift核心设计理念的理解,是否真写过Swift而非只会语法。
- 先讲行为差异:struct赋值是拷贝、class是引用共享,涉及堆栈分配。
- 给判断标准:无身份语义、小数据量、希望避免共享状态时用struct。
- 举项目实例,如模型层用struct、ViewModel或需要继承的场景用class。
- 可补充Swift标准库大量用struct的原因:线程安全和写时复制。
别踩:只说「struct更快」却不解释为什么,或完全说不出项目里的实际用法。
OC 的 runtime 你了解多少?实际用过吗?
考察点:考察OC底层理解深度,区分只会用API和懂原理的人。
- 先一句话定位:runtime是消息发送机制的运行时实现。
- 讲核心机制:消息查找流程、方法交换、动态添加属性或方法。
- 必须给实际用例,如用方法交换做埋点或防崩溃兜底,说清实现步骤。
- 没用过就说没用过,但讲清楚原理,别硬编项目经历。
别踩:背一堆runtime名词却举不出一个自己写过的应用场景。
weak 和 unowned 的区别?为什么 weak 属性会被自动置 nil?
考察点:考察内存管理基础是否扎实,这是iOS面试的必考点。
- 讲清区别:weak指向对象释放后自动置nil,unowned不会、访问会崩溃。
- 解释原理:对象dealloc时runtime会遍历weak表把指向它的指针置nil。
- 给使用判断:可能形成循环引用且生命周期不确定用weak,能保证先释放的用unowned。
- 结合闭包场景举例:[weak self]的典型用法和何时可以不用。
别踩:只会说「防循环引用」,追问置nil原理就答不上来。
iOS 核心机制
讲讲内存管理,ARC 下还会内存泄漏吗?你怎么排查的?
考察点:考察对ARC边界的理解,以及是否有真实的排查工具使用经验。
- 先明确:ARC只解决引用计数管理,循环引用、闭包捕获、非内存资源仍会泄漏。
- 列举常见泄漏点:闭包强捕获self、delegate用strong、NotificationCenter未移除。
- 讲排查流程:用Instruments的Leaks或Memory Graph定位持有链。
- 给一个自己修过的真实泄漏案例,说清原因和改法。
别踩:只说「用weak解决」,说不出排查工具和具体持有链分析过程。
主线程卡顿怎么排查和优化?
考察点:考察性能优化的实战能力,这是中高级岗位的分水岭题。
- 先讲定位手段:用Instruments的Time Profiler或卡顿监控工具抓主线程耗时调用。
- 分类讲常见原因:主线程做IO或解码、布局计算频繁、大量同步锁等待。
- 给优化手段:图片异步解码与降采样、复杂布局预计算、耗时操作移到子线程。
- 强调量化结果:优化前后用数据说话,如帧率或耗时对比。
别踩:答案全是「开子线程」三板斧,没有定位过程和数据验证。
GCD 和 OperationQueue 你怎么选?讲讲你用过的多线程场景。
考察点:考察多线程方案选型能力和实际并发编程经验。
- 讲选型逻辑:简单一次性任务用GCD,需要取消、依赖、并发数控制用OperationQueue。
- 给真实场景:如批量图片下载用OperationQueue控制并发和取消。
- 提线程安全:讲你如何用串行队列或锁保护共享数据。
- 可以补充死锁或优先级反转等坑,说明踩过或了解。
别踩:只背API区别,说不出一个自己写过的并发场景和踩过的坑。
讲讲离屏渲染,为什么圆角会卡?
考察点:考察渲染原理的理解深度,区分只会调API和懂图形栈的人。
- 先讲原因:系统需要先在离屏缓冲区合成再渲染,触发上下文切换开销。
- 讲触发条件:圆角加裁剪、阴影、光栅化等常见场景。
- 给替代方案:用预渲染圆角图、用layer的mask或绘制方式避免触发离屏。
- 强调用Instruments的渲染调试确认是否真的离屏,别凭感觉优化。
别踩:背「圆角会卡」的结论但说不出离屏渲染的机制和验证方法。
项目经历深挖
挑你简历里最有技术含量的一个模块,讲讲你的方案和为什么这么设计。
考察点:考察技术方案能力和ownership,这是技术面最核心的一题。
- 用30秒讲清背景、约束和你的角色,别一上来就讲实现细节。
- 讲方案时先说备选项和你为什么否掉,体现权衡而非堆功能。
- 讲2-3个关键实现难点和你的解法,准备好被追问代码级细节。
- 收尾给结果数据:性能指标、稳定性或业务效果。
别踩:只讲「我做了什么」不讲「为什么这么做」,被追问备选方案就卡住。
这个模块里最难的一个bug是什么?你怎么定位的?
考察点:考察问题定位方法论,是真解决问题还是只改表面症状。
- 选一个有技术含量的bug,别选「改了一行就好了」的例子。
- 讲定位过程:现象、假设、用什么工具验证、如何缩小范围。
- 讲根因和修复,说明为什么不是打补丁式修复。
- 可以补充事后如何避免同类问题,如加监控或规范。
别踩:讲的bug太浅,或定位过程全靠「猜」,暴露缺乏系统排查能力。
如果让你现在重做这个模块,你会改哪些设计?
考察点:考察技术反思能力和架构视野,看你是否从项目中真正成长。
- 诚实指出1-2个当时的设计缺陷,别说自己做得完美。
- 讲清当时的约束是什么,为什么在那个条件下是合理取舍。
- 给出现在的改进方向:解耦、扩展性、可测试性等具体维度。
- 体现迭代思维:好方案是演进出来的,不是一次设计到位。
别踩:要么全盘否定过去的自己显得不成熟,要么说「没什么可改」显得没思考。
这个功能是你独立做的还是团队做的?你具体负责哪部分?
考察点:核实简历真实性,确认你的真实贡献边界。
- 如实说明分工:你负责的模块、协作的同事角色。
- 重点讲你负责部分的深度细节,这部分必须经得起追问。
- 如果只是参与,讲清你在协作中解决的具体问题。
- 别夸大独立完成度,面试官会顺着细节验证。
别踩:把团队成果说成个人成果,细节追问时前后矛盾。
情景应变与系统设计
App 启动慢,你会从哪些方面入手优化?
考察点:考察系统性分析能力,能否把零散优化点组织成方法论。
- 先分阶段:讲启动流程的pre-main和main之后两个阶段。
- 讲定位:用Instruments或埋点拆解各阶段耗时,找大头。
- 分类给手段:减少动态库、延迟初始化、首屏渲染优化、二进制重排等。
- 强调先测量再优化,给目标值和验证方式。
别踩:直接罗列优化手段,没有「先测量定位再动手」的分析框架。
线上出现一个偶现崩溃,崩溃日志只有堆栈,你怎么办?
考察点:考察线上问题排查能力,是否有完整的定位闭环。
- 先讲信息收集:崩溃率、机型系统分布、版本、用户操作路径。
- 讲符号化分析:还原堆栈,结合代码定位可疑点。
- 讲假设验证:复现路径推测、加日志或监控灰度验证。
- 讲兜底:修复前是否有防护措施,如异常捕获或降级。
别踩:只说「看日志改代码」,没有信息收集和假设验证的过程。
设计一个图片加载组件,你会怎么设计缓存和下载策略?
考察点:考察组件设计能力:分层、缓存策略、扩展性的综合考量。
- 先讲分层:下载层、缓存层、展示层解耦,各自职责单一。
- 讲缓存设计:内存缓存加磁盘缓存两级,淘汰策略和大小限制。
- 讲下载策略:去重合并相同请求、取消机制、优先级。
- 提扩展点:解码策略、失败重试、可插拔的缓存实现。
别踩:只讲功能列表不讲设计权衡,被问「为什么两级缓存」答不出。
行为面试与反问环节
和产品或后端意见不一致的时候,你怎么处理的?举个例子。
考察点:考察协作方式和沟通成熟度,是否只会硬顶或全听。
- 用STAR结构讲一个真实例子,别空谈原则。
- 体现先理解对方约束:产品要交付节奏、后端有接口成本。
- 讲你怎么用数据或技术方案找到双方都能接受的解。
- 收尾讲结果,以及事后有没有沉淀成流程避免重复争论。
别踩:例子变成吐槽对方,或答案显得自己永远妥协没有立场。
你为什么想离开现在的公司?
考察点:考察离职动机是否稳定,判断入职后会不会很快再走。
- 从成长角度说:技术栈固化、业务方向与个人目标不匹配等中性原因。
- 绝对不说前公司或前同事的坏话。
- 把话题转向目标公司:为什么这里的业务和技术吸引你。
- 保持简短,两三句说完,别长篇大论。
别踩:抱怨薪资、加班或领导,HR会直接标记为风险候选人。
你还有什么想问我们的?
考察点:考察你对这个机会的认真程度,以及关注点是否匹配岗位。
- 准备2-3个真问题:团队技术栈构成、这个岗位要解决的核心问题。
- 可以问业务方向:App的迭代节奏和技术投入优先级。
- 避免第一轮就问薪资福利和加班,这些留到HR环节。
- 问题要具体到这个团队,别问网上能查到的公司信息。
别踩:说「没什么想问的」,直接传递出对岗位无所谓的信号。
面试准备清单
| 什么时候 | 要做什么 |
|---|---|
| 面试前 3 天 | 把简历上每个项目过一遍,每个技术点准备「为什么这么做」和「备选方案」,写不出答案的删掉简历里对应描述。 |
| 面试前 3 天 | 过一遍高频基础:内存管理、多线程、runloop、渲染原理,每题先自己口头答一遍再对照要点补漏。 |
| 面试前 1 天 | 准备2个项目深挖故事:一个技术方案设计、一个疑难bug定位,各按「背景-方案-难点-结果」结构练到5分钟内讲完。 |
| 面试前 1 天 | 查目标公司的App,准备1-2条具体的产品或技术观察,面试时自然带出,体现针对性。 |
| 面试当天 | 提前10分钟到场或上线,手机静音;远程面试提前测试麦克风、屏幕共享和手写代码环境。 |
| 面试当天 | 反问问题写在手边:团队技术栈、岗位核心问题、入职后前三个月的期望,避免临场想不起来。 |