ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

iOS秋招面经复盘:从简历投递到HR面的避坑指南

2026/8/30 9:44:10 拓冰建站 浏览量
iOS秋招面经复盘:从简历投递到HR面的避坑指南 iOS 秋招复盘一份面经一堆实话又到秋招季铺天盖地的iOS面经我已经看了不少但真正把自己从简历投递到HR面全流程走下来还能心平气和写总结的人其实不多。我今年完整走完了这一轮iOS秋招投了四十多家面了二十来场拿到的offer不算顶尖但心里踏实。这篇东西分两块一块是能直接抄作业的面经另一块是坐在面试官对面时那些没法写进简历的心里话。先说清楚这篇文章适合谁准备冲2026届秋招的iOS方向同学、犹豫要不要继续卷客户端的在校生、以及刚转iOS不久想系统查漏补缺的初级开发。内容覆盖面试复盘、考察重点、手写题实操和心态管理都是我这一路踩坑换来的有些话可能不好听但确实管用。1. 秋招之前iOS岗还值不值得冲以及我怎么做选择1.1 行情观察客户端岗位的真实供需状况网上关于客户端已死的论调喊了好几年但实际投递下来我的体感是iOS岗位没死只是门槛高了不少。以前会点OC、能搭界面就能进中小厂现在哪怕是中厂一面上来就问底层原理和架构设计和五年前完全不是一个量级。我觉得做选择之前先看数据。今年我统计了某招聘平台秋招前放出的iOS校招岗一线大厂加二线头部加起来一百多个比去年略少但绝对没到绝迹的程度。而且有个细节值得注意很多招iOS的岗位描述里都写了负责大前端基础能力建设或者跨端方案落地说明纯原生App开发确实在收缩但是客户端基建、性能、架构方向是缺人的。所以投递方向要对准不要只写熟练使用UIKit要往基础能力和架构方向靠。1.2 简历打磨项目亮点怎么提炼技能清单别写满我拿自己简历改了七个版本才敢投出去。第一版犯了典型错误把OC和Swift并列把AFNetworking、SDWebImage、MJRefresh全列上看起来像工具人。后来一个做iOS十年的学长帮我改给了两条关键建议。第一每个项目只留一个核心亮点写到结果导向。比如我的电商项目原本写实现了商品列表页改成了通过预加载和异步绘制优化列表滑动流畅度将卡顿率从3%降低到0.8%。面试官根本不关心你做了多少功能关心的是你面对问题怎么思考以及你做的东西产生了什么影响。第二技能清单写8-10条就够写满反而暴露短板。重点写你能聊透的比如深入理解Runloop底层机制这种话写上去就意味着你要准备好被连问三轮从源码到应用场景答不上来就是减分项。我自己的技能清单是OC/Runtime、Swift、内存管理、Runloop、多线程GCD/NSOperation、网络层封装、组件化架构、性能优化。写上去的每个词我都能展开讲半小时。1.3 投递策略提前批、正式批、内推怎么分配投递策略很多人不重视实际影响特别大。我的方法是提前批只投最想去的三到五家不海投。理由很简单提前批名额少、流程快但面试难度不比正式批低而且有些公司提前批挂了正式批还能再投海投导致时间冲突状态没调整好就上战场得不偿失。正式批开始后我把公司分成三档冲刺档、匹配档、保底档比例大概是3:4:3。冲刺档是业务和团队我都满意的大厂需要重点准备匹配档是目前实力够得着的公司目标是拿offer积累信心保底档是薪酬可能低一点但基本能成的公司用来兜底。内推能用就用但是内推的作用只是让简历被看到的概率大一点绝对不意味着面试放水该刷的题一道都躲不掉。2. 面试官最常问的iOS核心知识点我把高频题拆了一遍2.1 OC与Swift的异同别只背面向对象iOS面试第一波通常问语言基础。OC和Swift的对比题出现频率极高但大多数人的回答停留在OC是动态语言Swift是静态语言这种大白话层面这种答案面试官基本不会满意。我的答法分四层语言特性、内存模型、并发模型、生态差异。先说语言特性。OC的消息机制objc_msgSend决定了动态派发是它的灵魂你在OC里调用一个方法本质上是给对象发一条消息对象能不能响应是运行时才决定的。Swift则偏向静态派发通过函数表或者直接调用编译期就能确定大部分调用关系这是Swift性能强的主要原因之一。再看内存模型。OC的引用计数是手动的管理理念加上ARC的编译器辅助autoreleasepool配合runloop去控制声明周期Swift除开引用类型值类型struct、enum靠copy-on-write内存布局完全不一样。这个点喜欢延伸问Struct和Class怎么选别直接答结构体是值类型、类是引用类型就完了要补充小数据、无继承需求、需要不可变性时优先struct需要引用语义、需要继承和多态、需要和OC混编时用class。并发模型也常考。OC里GCD和NSOperation用得最多Swift有async/await和actor。问到这个点面试官其实想看你对新特性的理解不能只答OSSpinLock和GCD要把Swift Concurrency说得清楚。actor解决了数据竞争的核心方案——把可变状态隔离在actor内部通过编译器保证并发安全。说到生态差异必须提OC和Swift混编。项目里Swift和OC互相调用的原理、桥接头文件怎么配、什么时候该用objc、什么时候用dynamic dispatch这些都是实战问题没写过混编项目的人会露馅。2.2 内存管理从ARC问到weak底层内存管理是iOS面试的中场核心几乎每一轮技术面都会碰到。典型追问路径是什么是ARCweak和assign的区别weak的实现原理是什么循环引用怎么解决我建议把这条链路完整吃透不要停在表面。ARC全称Automatic Reference Counting本质上还是引用计数只是编译器在合适位置自动插入retain/release。weak和assign的区别好答weak修饰对象assign修饰基本类型对象释放后weak指针自动置nilassign不会。但到weak的实现原理很多人卡壳。我的理解是weak背后有一张全局的弱引用表SideTable里的weak_table存储的是对象的地址到weak指针地址的映射。对象释放时会通过dealloc找到对应的SideTable把所有指向这个对象的weak指针遍历一遍逐个置为nil然后把记录从weak表中移除。回答这个点的时候能画出结构图、说出先置nil再清理记录的顺序面试官基本就点头了。循环引用要分场景答Block循环引用、代理循环引用、NSTimer循环引用。Block的解决办法是用__weak修饰self但要注意block内部如果用了延迟执行弱引用可能已经被释放所以常配合__strong self在block内做强引用。NSTimer的循环引用比较隐蔽iOS 10之前需要用block版本weakSelfiOS 10以后系统提供了block方式方便处理但block内依然要小心强引用。面试官问到这里通常会加一句你项目里遇到过循环引用吗这是送命题一定要提前准备好真实案例。2.3 Runloop、多线程与性能优化三件套Runloop是iOS面试最能拉开差距的知识点。问的形式很多Runloop是什么和线程的关系有哪几种mode内部实现机制是什么和autoreleasepool有什么关系和屏幕刷新有什么关系我给一个能讲十分钟的脉络Runloop是一个事件循环每个线程都有一个Runloop主线程的Runloop默认启动子线程的需要手动获取并run。它有三个重要组成部分Source事件源、Timer定时器、Observer观察者。Source分Source0和Source1Source0是需要手动触发的内部事件Source1是系统内核事件比如触摸事件。Observer可以监听Runloop的状态比如即将进入休眠、即将处理Timer、即将退出。Runloop和定时器的关系是高频考点在列表滚动的时候默认RunloopMode是UITrackingRunLoopModeTimer默认添加在NSDefaultRunLoopMode滚动时Timer就不执行。解决办法是把Timer加到NSRunLoopCommonModes下或者在滚动结束后重新添加。和autoreleasepool的关系是Runloop每次循环结束会释放一次autoreleasepool所以大量临时对象产生时不会造成内存峰值过高。这在回答内存优化问题时特别有用。多线程千万别只背概念。GCD的队列有串行、并行、主队列、全局队列死锁的经典问题要会分析主队列同步添加任务会死锁串行队列内同步添加会死锁。NSOperationQueue是基于GCD的更高层抽象可以设置最大并发数、依赖关系、取消操作。面试官真正想听的是应用场景比如图片异步加载用并行队列信号量控制并发数DB写入操作放到串行队列防止数据竞争。性能优化问起来比较发散但核心就三块启动优化、卡顿优化、内存优化。启动优化要讲pre-main阶段的动态库加载、load方法、属性列表解析main之后的启动流程卡顿优化要讲掉帧原因main线程同步渲染、大量计算、图片解码、离屏渲染解决手段包括异步绘制、预渲染、栅格化内存优化则围绕泄漏排查、大图内存峰值、autorelease对象的生命周期来说。面官最喜欢问你线上遇到最棘手的性能问题是什么这必须来自真实项目编不出来。3. 真实面试题复盘从一面到HR面我都经历了什么3.1 技术一面基础加项目的组合拳我面的第一场是一家做内容社交的中厂一面直接是个眼神锐利的架构师。开场没有自我介绍直接问说说你印象最深的一个技术问题。我讲的是电商App首页Feed流卡顿治理。当时首页用UITableView承载图文混排图片多的时候滑动掉帧严重。先通过Time Profiler定位到主线程耗时集中在图片解码和Cell布局计算上然后分三步优化把图片解码放到子线程并缓存解码结果用异步绘制避免主线程做复杂排版对Cell做复用和高度预计算。优化后帧率从30fps以下提升到接近60fps。他说还行那我考考你接着问了SDWebImage的完整加载流程、LRU缓存的实现、图片解码到底解的是什么。这几道题我都有准备SDWebImage的流程是先查内存缓存再查磁盘缓存都没有才走网络下载下载完成后解码再缓存同时考虑NSURLRequest的缓存策略和Operation的取消机制。LRU缓存的实现要点是把Node放到双向链表头和尾头部存最新访问尾部淘汰。问到图片解码解的是什么答案是图片从JPEG/PNG压缩格式变成位图Bitmap的过程位图是RGBA像素数组这个转换CPU开销大所以要在子线程做并缓存。一面整体感受是项目细节会扣得很深面试官会根据你说的一个优化方案不停往下追问边界情况所以没做过的优化别往简历上写否则每个字都是漏洞。3.2 技术二面架构设计与系统设计怎么聊二面通常更宏观。有一家工具类大厂的二面面试官上来就问如果让你设计一个组件化方案你的核心思路是什么这种题没有标准答案但要体现工程思维。我的思路是先分基础组件和业务组件基础组件包括网络层、存储、UI组件、工具库业务组件按功能模块拆比如登录模块、首页模块、消息模块。模块间不能直接依赖通过路由中间件通信路由表注册URL和block的映射关系每个模块有自己的对外接口类内部实现细节不暴露。他的追问很有意思如果模块A需要调用模块B的某个能力但模块B还没加载完怎么办答是路由层做异步加载和懒加载模块间的调用先注册后使用未就绪时缓存调用请求模块加载完再消费。这种题不能死背得把组件化、路由、依赖注入的思想打通同时结合你真实项目中的应用哪怕只是部分应用也要能自圆其说。另一场二面问的是Swift的Protocol和泛型在项目里的实际用法。这个话题比较进阶但如果你简历写了Swift优先这就是必考题。我的回答是网络层用Protocol定义请求协议RequestType泛型约束ResponseType配合Codable做自动解析UI层用Protocol实现面向协议编程比如定义DataSource协议让不同类型的列表页复用同一个Container。面试官追问泛型在编译期做了什么时我还讲了特化和抽象。这里没点真功夫容易挂。3.3 HR面除了聊薪资还要注意什么HR面常被技术人忽略其实翻车率不低。我有一次HR面被问你秋招还投了哪些公司如果别人给你offer你会怎么选这个问题看着简单但答不好就废了。我的建议是不要说具体的公司名说类型。我投了一些大厂和几家做基础建设的团队主要看重平台的技术氛围和能接触的深度。不要抱怨我投了很多但都没回音HR会觉得你在施压也不要说我只投了你们一家太假。HR面还会问职业规划、项目团队冲突、遇到的失败经历。回答的原则是展示稳定性和成长性。说职业规划不要说三年做架构师要说希望在前两年把iOS底层原理吃透之后逐步承担模块设计和团队协作的职责。这既真实也符合公司培养人的预期。HR面还有一个坑谈薪。作为应届生秋招谈薪空间其实有限但学校Offer上的base会影响你手上的其他机会。我的做法是如果手上有其他offer直接说目前手上有一个XX左右的offer如果贵司能给到相近水平我会更倾向选择这边这是合理透明的信息HR也能接受。如果手上没有offer就诚恳说希望能在市场水平内争取合理薪资不要漫天要价。4. 手写代码题这是秋招最容易翻车的地方4.1 手写单例、KVO、Block循环引用的标准答法手写题是iOS秋招技术面的标配有些甚至是共享屏幕当场写。我吃过亏所以把高频手写题都过了一遍。单例是最低配的考察点。OC版本要用dispatch_once保证线程安全 (instancetype)sharedInstance { static MyClass *instance nil; static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ instance [[MyClass alloc] init]; }); return instance; }Swift版本可以写静态常量static let shared MyClass() private init() {}Swift里要答到为什么static let天然线程安全——Swift保证static let初始化时是懒加载且线程安全的。KVO的手写实现比较进阶。考察点是你是否理解KVO底层原理系统在第一次对某个类添加KVO监听时动态生成子类NSKVONotifying_xxx重写被监听属性的setter方法在setter里先调用super的setter再通知观察者。手写时不需要完整实现但要把注册、回调、移除的逻辑写清楚。Block循环引用手写题通常是给你一段代码让你找出循环引用并修复。经典场景是ViewController持有block属性block内部访问self的属性。修复方式是weakSelf。但要进一步答到如果block是延迟执行的比如dispatch_afterweakSelf可能已经释放所以block内部需要strongSelf保证执行期间self存活__weak typeof(self) weakSelf self; self.block ^{ __strong typeof(self) strongSelf weakSelf; if (strongSelf) { [strongSelf doSomething]; } };4.2 场景题多线程同步、链表反转、动态规划高频题除了iOS概念题算法和并发场景题也经常出现。iOS面试的算法难度整体比后端低一般到LeetCode中等偏下但多线程场景题很常考。多线程同步题我碰到最多的是十个线程同时读、一个线程写怎么保证线程安全答法是读写锁pthread_rwlock_t或dispatch_barrier_async。用GCD的并发队列配合barrier实现读并发、写独占是最常见的方案- (id)readDataForKey:(NSString *)key { __block id result; dispatch_sync(self.concurrentQueue, ^{ result [self.dictionary objectForKey:key]; }); return result; } - (void)writeData:(id)data forKey:(NSString *)key { dispatch_barrier_async(self.concurrentQueue, ^{ [self.dictionary setObject:data forKey:key]; }); }注意dispatch_barrier_async传入的queue必须是自定义并发队列如果是全局并发队列行为就完全不一样了这是面试官喜欢埋的坑。链表反转是算法题里的送分题但也不能大意。迭代版三指针法和递归版都要会我遇到的是要求当场写两个版本并解释区别。动态规划则喜欢考爬楼梯、打家劫舍、最长公共子序列这种经典题掌握了状态定义和转移方程基本就能应对。4.3 设计题图片缓存、线程池、消息队列怎么聊设计题考察的是系统设计能力iOS岗最常见的题是设计一个图片缓存库。这题命中率极高因为SDWebImage大家都会用但能不能从零设计出一个合理方案是区分度和加分点所在。我的答法是三层缓存架构内存缓存用NSCache自动清理、磁盘缓存用文件系统、网络层负责下载。内存缓存淘汰策略用LRU磁盘缓存注意控制总大小和清理时机。下载层要做任务合并同一URL只允许一个下载任务其他等待者共享结果。还要处理磁盘缓存过期策略、图片解码放到子线程、内存告警时清理缓存。有时间会追问如果有1000张不同尺寸缩略图请求如何避免重复解码答法是缓存键用URL目标尺寸组合解码结果按尺寸缓存或者用字节级数据缓存只解一次然后按尺寸生成缩略图。线程池题问的是设计一个线程池支持任务队列、最大并发数、线程复用。这不是iOS特有问题但C/OC实现都会被问到。消息队列题相对少一些可能结合客户端事件传递问答案就是Runloop的Source机制。5. 闲言碎语秋招时间线、心态崩溃与自我调节5.1 我的秋招时间线回顾现在回头看我的秋招时间线是3月到5月刷题和补基础6月改简历7月初投提前批8月正式批海投加笔试8月底到10月密集面试10月中开始谈offer11月收尾。这里有个很痛的教训我3月还在纠结要不要坚持iOS浪费了整整一个月。如果穿越回去我会提前半年定方向。这不是说不能试其他方向而是试完要有个deadline。我认识一个同学安卓、iOS、后端都投结果简历上没有一条线是深入的面试全挂在项目细节上。方向可以不只有一个但主线一定要清楚。提前批一定不要错过。大厂提前批面试流程相对短而且有些团队提前批的HC就是正式批的HC提前面上岸概率更大。我自己提前批面了两家虽然挂了但积累了宝贵的实战经验到正式批时第一面的紧张感已经消了大半。5.2 捡了芝麻丢了西瓜的教训秋招最耗人的不是面试本身而是等待和比较。我8月底面完一家感觉不错的公司结果两星期没消息那段时间我天天刷邮箱、刷牛客精神内耗拉满然后稀里糊涂地又投了一堆小公司去保底结果笔试面试互相撞车状态一塌糊涂。现在反思这是典型的捡了芝麻丢了西瓜。秋招是马拉松不是冲刺跑。与其焦虑地疯狂海投不如静下来把手上能面的公司列个表标注阶段和优先级按优先级准备。等结果的空档最好的利用方式是复盘上一场面试的问题、整理错题本而不是刷社区制造焦虑。另一个教训是不要因为一家公司挂了一面就否定自己。我9月初面一家大厂一面自我感觉非常好结果挂了。后来问内推人对方说反馈是你技术可以但团队更想要有SwiftUI经验的人。有时候挂你不是你不够好是匹配度问题看开就好。5.3 面试复盘方法录音、速记、错题本面试复盘是我认为整个秋招最有价值的一件事但多数人做得不好。我的方法是每场面试结束30分钟内趁热把问题记录下来写清楚每个问题我当时怎么答的、面试官追问了什么、哪个点没答上来。有条件的征得对方同意后录音不然就靠速记手机备忘录就够。然后每周整理一次错题本。错题本不是把题目抄下来就完了要写为什么没答好。比如我问自己Runloop mode的问题为什么说得很乱答案是我根本没理解CommonModes的实现机制只背了结论。于是我把源头找出来CFRunLoop源码里commonModesItem的结构把原理搞懂再遇到就不怕了。错题本还有一个用法面试前熬夜冲刺。我每次面试前不是全部重看而是只看错题本特别高效。到后期我的错题本已经有四十多道题覆盖面已经很广考前翻一遍基本就稳了。6. 避坑指南简历投递到谈offer的隐形坑6.1 简历命名、邮件和投递时间的小细节简历投递的隐形坑很多人不以为意其实能影响第一印象。简历命名建议写成姓名-学校-iOS开发-电话不要只写简历.pdfHR每天收几百封邮件命名规范的简历至少不会被误分类。邮件正文不要空白。写三句话自我介绍加一句对贵司iOS岗位非常感兴趣希望获得面试机会这是基本礼仪。投递时间上工作日上午10点到11点投递效果通常最好因为HR周一的处理高峰还没来周五下午投大概率要等到下周一才被看到战线拉长变数就多。内推不是万能药。我之前以为找学长内推就稳了结果发现内推只是帮你把简历往上递通过率取决于简历本身。更需要注意的是内推信息一定要核实尤其小心网上有偿内推的坑别为了内推名额泄露个人信息。正规渠道是通过认识的人或者牛客上的员工验证帖免费内推。6.2 笔试环节的坑不要裸考、注意编译环境笔试是秋招淘汰率最高的环节没有之一。我的经验是笔试和面试要分开准备。面试考iOS知识笔试题往往是算法加基础考察方式和面试完全不同。笔试题型通常是单选、多选、编程题。iOS方向的笔试还会考一些操作系统、网络、数据库基础知识这个我没有刻意复习靠平时积累。编程题大概率是LeetCode原题或改编题所以刷题要刷到不看答案能写出来的那种程度而不是我见过。笔试环境也是坑。我经历过牛客网、赛码、自家OJ三种系统输入输出处理方式不太一样。牛客和赛码要注意处理多行输入输出的格式赛码的JS环境有时候不支持某些语法。建议提前去笔试平台做模拟题熟悉编译器的输出格式笔试时先做有把握的题目再回头啃难题。6.3 面试中的隐形考察点沟通、追问、反问面试官看什么技术能力只是一部分还会看你的沟通方式、逻辑思维、抗压能力。有一次面试官问了一个我不会的问题我老实说这块我了解不多然后说但我可以从相关角度尝试分析一下接着讲了我对相近机制的认知。面试官后来说就是这句我尝试分析一下给我加了分——他看的不是你会不会而是遇到未知问题时愿不愿意动脑搭框架。所以面试时不要怕说我不会但要接着说我的理解是...我可以这样推测...。比硬编一个答案强一百倍。追问环节也很关键有时候面试官会故意往深里追问看你知识的边界在哪里。被问到不会的时候可以明确说出你的边界再给出你目前知道的最近的关联知识点这比沉默或瞎说好得多。反问环节也别浪费。不要问这个岗位加班多吗这类暴露短视的问题。建议问团队目前最大的技术挑战是什么如果我入职前三个月的主要任务是什么这两个问题能帮你判断团队的真实情况也能让面试官觉得你在认真考虑这个岗位。最后再分享一个小技巧面了那么多场我发现一个规律iOS开发的知识体系是盘根错节的面试官问到一个点看似单独考其实是从一个知识树里摘出来的你如果不了解大树的全貌就会答得很孤立。所以我建议大家别看零散的面经问题把iOS的知识体系自己画一张脑图从语言到运行机制从UI到网络从并发到性能从架构到工具链缺哪补哪。我秋招后期能在几场面试里游刃有余靠的就是这张图。知识体系建好了什么面试题都只是叶子根在你心里。希望这份总结能让你的秋招少踩几个坑好运。