vinqi.com

iOS开发工程师面试题及答题要点

iOS工程师(也叫苹果开发、iOS开发)的面试通常2-4轮:一轮技术基础、一轮项目深挖、可能加一轮算法或系统设计,最后是HR面。最容易挂的不是基础题,而是项目深挖环节——简历上写了什么,面试官就会顺着问到底,答不出实现细节直接出局。

语言基础(Swift / Objective-C)

Swift 和 Objective-C 你都用过吗?项目里怎么选型的?

考察点:考察是否有双语言实战经验,以及技术选型是否有依据而非跟风。

答题要点:
  1. 先说结论:主力用什么、旧代码维护用什么,别含糊说「都会」。
  2. 给出选型理由,如新模块用Swift、存量OC代码渐进迁移,说明混编的桥接成本。
  3. 提一个实际踩过的坑,如Swift调OC的空值处理或混编编译速度问题。
  4. 如果只用过一种,坦诚说明,并讲你了解另一种的哪些机制。

别踩:只背语言优劣对比表,说不出自己项目里的真实选型过程。

讲讲 Swift 的值类型和引用类型,什么时候用 struct 什么时候用 class?

考察点:考察对Swift核心设计理念的理解,是否真写过Swift而非只会语法。

答题要点:
  1. 先讲行为差异:struct赋值是拷贝、class是引用共享,涉及堆栈分配。
  2. 给判断标准:无身份语义、小数据量、希望避免共享状态时用struct。
  3. 举项目实例,如模型层用struct、ViewModel或需要继承的场景用class。
  4. 可补充Swift标准库大量用struct的原因:线程安全和写时复制。

别踩:只说「struct更快」却不解释为什么,或完全说不出项目里的实际用法。

OC 的 runtime 你了解多少?实际用过吗?

考察点:考察OC底层理解深度,区分只会用API和懂原理的人。

答题要点:
  1. 先一句话定位:runtime是消息发送机制的运行时实现。
  2. 讲核心机制:消息查找流程、方法交换、动态添加属性或方法。
  3. 必须给实际用例,如用方法交换做埋点或防崩溃兜底,说清实现步骤。
  4. 没用过就说没用过,但讲清楚原理,别硬编项目经历。

别踩:背一堆runtime名词却举不出一个自己写过的应用场景。

weak 和 unowned 的区别?为什么 weak 属性会被自动置 nil?

考察点:考察内存管理基础是否扎实,这是iOS面试的必考点。

答题要点:
  1. 讲清区别:weak指向对象释放后自动置nil,unowned不会、访问会崩溃。
  2. 解释原理:对象dealloc时runtime会遍历weak表把指向它的指针置nil。
  3. 给使用判断:可能形成循环引用且生命周期不确定用weak,能保证先释放的用unowned。
  4. 结合闭包场景举例:[weak self]的典型用法和何时可以不用。

别踩:只会说「防循环引用」,追问置nil原理就答不上来。

iOS 核心机制

讲讲内存管理,ARC 下还会内存泄漏吗?你怎么排查的?

考察点:考察对ARC边界的理解,以及是否有真实的排查工具使用经验。

答题要点:
  1. 先明确:ARC只解决引用计数管理,循环引用、闭包捕获、非内存资源仍会泄漏。
  2. 列举常见泄漏点:闭包强捕获self、delegate用strong、NotificationCenter未移除。
  3. 讲排查流程:用Instruments的Leaks或Memory Graph定位持有链。
  4. 给一个自己修过的真实泄漏案例,说清原因和改法。

别踩:只说「用weak解决」,说不出排查工具和具体持有链分析过程。

主线程卡顿怎么排查和优化?

考察点:考察性能优化的实战能力,这是中高级岗位的分水岭题。

答题要点:
  1. 先讲定位手段:用Instruments的Time Profiler或卡顿监控工具抓主线程耗时调用。
  2. 分类讲常见原因:主线程做IO或解码、布局计算频繁、大量同步锁等待。
  3. 给优化手段:图片异步解码与降采样、复杂布局预计算、耗时操作移到子线程。
  4. 强调量化结果:优化前后用数据说话,如帧率或耗时对比。

别踩:答案全是「开子线程」三板斧,没有定位过程和数据验证。

GCD 和 OperationQueue 你怎么选?讲讲你用过的多线程场景。

考察点:考察多线程方案选型能力和实际并发编程经验。

答题要点:
  1. 讲选型逻辑:简单一次性任务用GCD,需要取消、依赖、并发数控制用OperationQueue。
  2. 给真实场景:如批量图片下载用OperationQueue控制并发和取消。
  3. 提线程安全:讲你如何用串行队列或锁保护共享数据。
  4. 可以补充死锁或优先级反转等坑,说明踩过或了解。

别踩:只背API区别,说不出一个自己写过的并发场景和踩过的坑。

讲讲离屏渲染,为什么圆角会卡?

考察点:考察渲染原理的理解深度,区分只会调API和懂图形栈的人。

答题要点:
  1. 先讲原因:系统需要先在离屏缓冲区合成再渲染,触发上下文切换开销。
  2. 讲触发条件:圆角加裁剪、阴影、光栅化等常见场景。
  3. 给替代方案:用预渲染圆角图、用layer的mask或绘制方式避免触发离屏。
  4. 强调用Instruments的渲染调试确认是否真的离屏,别凭感觉优化。

别踩:背「圆角会卡」的结论但说不出离屏渲染的机制和验证方法。

项目经历深挖

挑你简历里最有技术含量的一个模块,讲讲你的方案和为什么这么设计。

考察点:考察技术方案能力和ownership,这是技术面最核心的一题。

答题要点:
  1. 用30秒讲清背景、约束和你的角色,别一上来就讲实现细节。
  2. 讲方案时先说备选项和你为什么否掉,体现权衡而非堆功能。
  3. 讲2-3个关键实现难点和你的解法,准备好被追问代码级细节。
  4. 收尾给结果数据:性能指标、稳定性或业务效果。

别踩:只讲「我做了什么」不讲「为什么这么做」,被追问备选方案就卡住。

这个模块里最难的一个bug是什么?你怎么定位的?

考察点:考察问题定位方法论,是真解决问题还是只改表面症状。

答题要点:
  1. 选一个有技术含量的bug,别选「改了一行就好了」的例子。
  2. 讲定位过程:现象、假设、用什么工具验证、如何缩小范围。
  3. 讲根因和修复,说明为什么不是打补丁式修复。
  4. 可以补充事后如何避免同类问题,如加监控或规范。

别踩:讲的bug太浅,或定位过程全靠「猜」,暴露缺乏系统排查能力。

如果让你现在重做这个模块,你会改哪些设计?

考察点:考察技术反思能力和架构视野,看你是否从项目中真正成长。

答题要点:
  1. 诚实指出1-2个当时的设计缺陷,别说自己做得完美。
  2. 讲清当时的约束是什么,为什么在那个条件下是合理取舍。
  3. 给出现在的改进方向:解耦、扩展性、可测试性等具体维度。
  4. 体现迭代思维:好方案是演进出来的,不是一次设计到位。

别踩:要么全盘否定过去的自己显得不成熟,要么说「没什么可改」显得没思考。

这个功能是你独立做的还是团队做的?你具体负责哪部分?

考察点:核实简历真实性,确认你的真实贡献边界。

答题要点:
  1. 如实说明分工:你负责的模块、协作的同事角色。
  2. 重点讲你负责部分的深度细节,这部分必须经得起追问。
  3. 如果只是参与,讲清你在协作中解决的具体问题。
  4. 别夸大独立完成度,面试官会顺着细节验证。

别踩:把团队成果说成个人成果,细节追问时前后矛盾。

情景应变与系统设计

App 启动慢,你会从哪些方面入手优化?

考察点:考察系统性分析能力,能否把零散优化点组织成方法论。

答题要点:
  1. 先分阶段:讲启动流程的pre-main和main之后两个阶段。
  2. 讲定位:用Instruments或埋点拆解各阶段耗时,找大头。
  3. 分类给手段:减少动态库、延迟初始化、首屏渲染优化、二进制重排等。
  4. 强调先测量再优化,给目标值和验证方式。

别踩:直接罗列优化手段,没有「先测量定位再动手」的分析框架。

线上出现一个偶现崩溃,崩溃日志只有堆栈,你怎么办?

考察点:考察线上问题排查能力,是否有完整的定位闭环。

答题要点:
  1. 先讲信息收集:崩溃率、机型系统分布、版本、用户操作路径。
  2. 讲符号化分析:还原堆栈,结合代码定位可疑点。
  3. 讲假设验证:复现路径推测、加日志或监控灰度验证。
  4. 讲兜底:修复前是否有防护措施,如异常捕获或降级。

别踩:只说「看日志改代码」,没有信息收集和假设验证的过程。

设计一个图片加载组件,你会怎么设计缓存和下载策略?

考察点:考察组件设计能力:分层、缓存策略、扩展性的综合考量。

答题要点:
  1. 先讲分层:下载层、缓存层、展示层解耦,各自职责单一。
  2. 讲缓存设计:内存缓存加磁盘缓存两级,淘汰策略和大小限制。
  3. 讲下载策略:去重合并相同请求、取消机制、优先级。
  4. 提扩展点:解码策略、失败重试、可插拔的缓存实现。

别踩:只讲功能列表不讲设计权衡,被问「为什么两级缓存」答不出。

行为面试与反问环节

和产品或后端意见不一致的时候,你怎么处理的?举个例子。

考察点:考察协作方式和沟通成熟度,是否只会硬顶或全听。

答题要点:
  1. 用STAR结构讲一个真实例子,别空谈原则。
  2. 体现先理解对方约束:产品要交付节奏、后端有接口成本。
  3. 讲你怎么用数据或技术方案找到双方都能接受的解。
  4. 收尾讲结果,以及事后有没有沉淀成流程避免重复争论。

别踩:例子变成吐槽对方,或答案显得自己永远妥协没有立场。

你为什么想离开现在的公司?

考察点:考察离职动机是否稳定,判断入职后会不会很快再走。

答题要点:
  1. 从成长角度说:技术栈固化、业务方向与个人目标不匹配等中性原因。
  2. 绝对不说前公司或前同事的坏话。
  3. 把话题转向目标公司:为什么这里的业务和技术吸引你。
  4. 保持简短,两三句说完,别长篇大论。

别踩:抱怨薪资、加班或领导,HR会直接标记为风险候选人。

你还有什么想问我们的?

考察点:考察你对这个机会的认真程度,以及关注点是否匹配岗位。

答题要点:
  1. 准备2-3个真问题:团队技术栈构成、这个岗位要解决的核心问题。
  2. 可以问业务方向:App的迭代节奏和技术投入优先级。
  3. 避免第一轮就问薪资福利和加班,这些留到HR环节。
  4. 问题要具体到这个团队,别问网上能查到的公司信息。

别踩:说「没什么想问的」,直接传递出对岗位无所谓的信号。

面试准备清单

什么时候要做什么
面试前 3 天把简历上每个项目过一遍,每个技术点准备「为什么这么做」和「备选方案」,写不出答案的删掉简历里对应描述。
面试前 3 天过一遍高频基础:内存管理、多线程、runloop、渲染原理,每题先自己口头答一遍再对照要点补漏。
面试前 1 天准备2个项目深挖故事:一个技术方案设计、一个疑难bug定位,各按「背景-方案-难点-结果」结构练到5分钟内讲完。
面试前 1 天查目标公司的App,准备1-2条具体的产品或技术观察,面试时自然带出,体现针对性。
面试当天提前10分钟到场或上线,手机静音;远程面试提前测试麦克风、屏幕共享和手写代码环境。
面试当天反问问题写在手边:团队技术栈、岗位核心问题、入职后前三个月的期望,避免临场想不起来。

常见问题

iOS面试一般几轮?每轮考什么?
常见2-4轮:1-2轮技术面(基础+项目深挖,部分公司加算法或系统设计),可能有一轮交叉面或leader面,最后HR面。中小公司可能一轮技术面加HR面就结束。算法题在大厂出现概率高,中小公司更看重项目实战。
只会Swift不会Objective-C能过面试吗?
新项目团队通常可以,但存量代码维护型岗位会要求OC。建议至少掌握OC的基本语法、内存管理和runtime核心概念,面试被问到时能讲原理。坦诚说主力语言是Swift,比硬装双语言精通更安全。
面试被问到不会的问题怎么办?
别硬编。先说这块了解不深,然后讲你了解的相关部分或类似问题的思路,展现推理过程。面试官考察的往往是面对未知的反应,直接说「没接触过,但我会从XX角度去查」比胡编强得多。
没有大厂经验,怎么提高面试通过率?
把项目深挖环节准备到极致:每个模块能讲清设计权衡、踩过的坑和量化结果。中小团队更看重「来了能干活」,突出你独立负责过完整功能、排查过线上问题的经历,比背八股文有效。

继续看这个岗位

相关岗位