iOS工程师能力评估体系:从背题到实战的面试方法论

发布时间:2026/8/29 6:36:01
iOS工程师能力评估体系:从背题到实战的面试方法论 去年年底团队扩编我作为 iOS 端的技术负责人集中面了一批候选人从简历筛选到终面全程跟下来。最大的感触是很多人的能力模型和简历上写的有不小偏差尤其是“背题型选手”占比比想象中高。这篇文章想把我在 iOS 工程师能力评估这件事上的思路、考察维度、面试题目设计、以及踩过的坑完整整理出来。不管你是准备跳槽的 iOS 开发者还是需要搭评估体系的团队 leader都能从中找到可直接落地的参考。1. 为什么传统“面试八股”测不出真实水平——我的评估思路转变先讲一个反直觉的结论面试中大量考察 RunLoop 原理、ARC 实现、Block 底层结构的题目实际上区分度越来越低。原因很简单这些内容在小红书、掘金、牛客上有大量整理好的“面试题合集”一个准备两周的应届生可以把这些概念背得比你面试官还熟。我遇到过好几个候选人开口就能把 Source0/Source1/Timer/Observer 的机制讲得清清楚楚但一追问“你实际在哪个项目里用它解决过问题”立刻卡壳。这种候选人你敢要吗1.1 从“考知识点”转向“考能力层级”我自己试过好几轮调整最后稳定下来的思路是把评估拆成五个层级每个层级对应不同的考察方式能力层级考察方式合格线优秀线知识层快问快答基础概念能准确说出定义能区分相似概念并指出适用边界原理层针对某个机制连续追问“为什么”能解释底层流程能说出设计动机和已知缺陷实践层给出问题场景让候选人现场排查能给出可行思路能按“定位→验证→解决→预防”完整闭环架构层开放设计题 深挖项目经验能画出模块划分能讲清楚拆分的理由和代价软素质层行为面试 协作场景表达清晰能主动暴露风险并给出权衡这个表的核心是不要用一种方式测试所有层级。我见过很多面试官从头到尾都在问“你用过什么框架、了解哪些 API”这只能测出知识层。更糟糕的是如果候选人在知识层很熟练面试官很容易产生“这个人行了”的错觉忽略了架构层和实践层可能完全不合格。1.2 一个具体的例子同样问 ARC不同回答暴露什么同样一个“ARC 是怎么工作的”问题我收到过三类回答初级答案“ARC 就是编译器自动帮我们插入 retain/release 代码不用手动管理内存了。”——能背定义。中级答案“编译器在合适的位置插入强引用/释放操作但底层还是 Objective-C 的引用计数。weak 不增加引用计数对象释放后 weak 变量自动置 nil。”——知道弱引用。高级答案“ARC 是编译期和运行时共同协作的结果。编译期负责插入 retain/release/autorelease运行时负责 SideTable 里的引用计数和弱引用表。weak 自动置 nil 是运行时在对象 dealloc 时查表做的。另外 ARC 在性能上还有一个优化叫 autorelease 优化允许返回对象时跳过 autorelease 池直接 retain减少一次函数调用开销。”——不仅知道是什么还知道为什么这么设计。从知识层看三级都能过从原理层看第三个人明显更胜一筹。但即使是第三个如果我继续追问“既然 weak 会在 dealloc 时自动置 nil那 weak 变量在多线程环境下访问安全吗”能答上来的人就极少了。真正的关键是候选人对“为什么”能扛住多少轮追问。追问三轮不倒说明是真正理解追问一轮就绕圈子大概率是背的。1.3 能力评估不是考试而是“对着需求找人”还要强调一点评估框架不是越难越好要和你团队的真实业务匹配。如果团队主要做工具类 App那对 RunLoop 底层机制的要求可以降低对 UI 细节、性能优化、组件封装的要求得提高如果做音视频或直播类 App那对内存、多线程、渲染管线的要求要远高于一般业务。我见过反面案例某团队所有面试题都照搬大厂结果面挂了好几个实际能力不错的候选人。后来一复盘才发现那些题里涉及的场景团队业务根本不会遇到。所以设定评估体系之前先想清楚这个岗位进来要解决什么问题把这个写下来再倒推考察点比什么都重要。2. 语言与运行时功底从基础语法到底层原理的真实考察清单语言层面是最容易考察也最容易流于表面的部分。我建议把范围收窄不要贪多挑几个真正能区分水平的点深挖。2.1 属性修饰符与所有权不是“背选项”而是“看场景”“strong、weak、copy、assign 有什么区别”这道题基本是送分题但我会换个问法“什么情况下用 copy为什么 NSString 属性要用 copy如果我用 strong 修饰一个 NSMutableString 会出什么问题”能答出“copy 修饰可以防止可变对象被外部修改”是基本分“用 strong 修饰 NSMutableString 时如果外部把它当作 NSMutableString 修改了我们这边的属性也会变”是及格分“那如果我用 copy 修饰 NSMutableString赋值时会不会发生 mutation 问题”是加分项。因为copy默认返回不可变拷贝但如果你声明的是 NSMutableString 且 copy 回来的是不可变对象后续调用 appendString 会直接崩——这个问题能看出来候选人有没有真正在项目里踩过坑。类似的Swift 里我会问值类型和引用类型的运行时差异struct和class怎么选以及数组、字典这些集合类型在嵌套时的 copy-on-write 特性。这里的关键不是问候选人知不知道 COW 这三个字母而是问他“如果一个 struct 里包含一个 class 类型的属性copy 这个 struct 时 class 会被复制吗”答案是“不会只有 struct 的值被复制class 引用还是同一个”能答出这一层的说明是真用过 Swift 而不是只翻了翻官方文档。2.2 内存管理从循环引用到自动释放池内存管理是 iOS 工程师的必修课也是评估中绝对不能省的一环。我总结过一套递进式题目基础循环引用是什么ARC 下怎么避免——低区分度。进阶Block 里访问 self 的成员变量是否需要 weak 化——很多人不知道[weak self]是如果你要用 self 就要写但如果直接用 self 的成员变量编译器会默认强引用捕获 self还是会循环引用。这一步能筛掉一批人。深入自动释放池在什么场景下必须用——这个问题的关键在于它不是“必须”与“不必”的关系而是“什么时候手动加 autoreleasepool 有价值”。最典型的场景是 for 循环里大量创建临时对象即使 ARC 下每个对象会在下一个 RunLoop 周期被释放但峰值内存可能飙得很高手动加池子可以让临时对象在每轮循环结束时就释放降低峰值。能举出这个例子的说明真的处理过内存峰值问题。底层SideTable的结构、weak 表的清除时机、dealloc的顺序——这个不用要求人人都会但如果候选人主动提到那大概率是源码党加分。注意这里要提醒评估者不要因为候选人答不出源码细节就一票否决。源码级理解在职级 P5/P6 里不是普遍要求但如果你要招一个需要做崩溃治理或 SDK 的专家岗这些就是必要的。2.3 RunLoop、多线程与锁从概念到场景RunLoop 是 iOS 面试的高频话题但我要强调考 RunLoop 不能只考“是什么”要考“怎么用”和“什么时候别用”。常见追问题我会这样设计主线程的 RunLoop 默认跑在哪种 mode 下什么时候 mode 会切换——知道滑动时从kCFRunLoopDefaultMode切到UITrackingRunLoopMode是基础。如果我用一个 timer 在滚动列表时仍然希望它准确触发应该怎么处理——答[[NSRunLoop mainRunLoop] addTimer:forMode:NSRunLoopCommonModes]是常规解但能进一步说明 CommonModes 本质是一组 mode 的集合timer 会注册到集合里的所有 mode这才是真正理解。如果你怀疑某个耗时任务阻塞了主线程 RunLoop你会怎么定位——这个问题能区分“背过”和“用过”。真处理过卡顿的人会提 Instruments 的 Time Profiler会提CFRunLoopObserver监控卡顿会用 Backtrace 抓主线程调用栈而不是只背 RunLoop 组成。GCD 和锁的问题同样要场景化比如“多个线程同时读写一个可变字典不加锁会怎样加锁怎么加读写锁怎么实现性能如何衡量”为了做题而做题的候选人会把synchronized、NSLock、dispatch_semaphore的优缺点背一遍但一追问“自旋锁为什么被废弃”就露馅。正确答案是自旋锁忙等会浪费 CPU且优先级反转问题严重替代方案os_unfair_lock是内核帮你做了调度省电且安全。这种细节没有真实性能调优经验是答不出动机的。3. 架构能力与工程化思维一道题区分初级与高级架构层考察是最难的因为没有一个标准答案。我的经验是用一道开放题 一段深挖项目经验从候选人的回答结构里判断真实的架构水平。3.1 我常考的一道现场设计题IM 消息列表页这道题的要求很简洁“设计一个 IM 会话列表页的架构要求支持多端同步、增量更新、离线消息、消息发送幂等。”低级方案MVC所有逻辑堆在 ViewController用UITableView直接绑数据。这种答案说明候选人只做过页面没做过复杂数据流。中级方案ViewModel 持有数据源VC 只做视图加载数据层用网络 本地缓存增量更新用手动 diff 或IGListKit。到这一步候选人对 MVVM 已经有实践知道数据驱动 UI。高级方案候选人会先反问需求——“消息量有多大单聊群聊是否需要多账号同步策略是推还是拉幂等用什么做唯一键”然后在方案里给出分层网络层、协议解析层、缓存层内存缓存 数据库、状态管理层发送中/失败/成功、UI 展示层同时说明为什么 DB 选 SQLite 而不是 Core Data为什么需要引入数据总线做跨模块通信。作为面试官我还要追问方案的缺点“你这个分层在消息量特别大的场景下会不会有瓶颈缓存层用 NSCache 的淘汰策略是什么”能坦诚回答“这里其实有隐患当时我们选择这样做的原因是……如果重新设计我可能……”的候选人比那些把方案吹得天花乱坠的人可信得多。这里有个很重要的判据候选人有没有主动说出系统的“代价”。架构没有银弹每个取舍都有代价。能主动谈代价的才是真做过架构的人。3.2 组件化、跨端与工程化别只看概念要看落地组件化和工程化是目前中大型团队的标配但“组件化”这三个字被用滥了。我问“你们项目怎么做组件化”最怕听到的答案是“我们把代码拆成多个文件夹每个模块一个目录”——这根本不叫组件化这叫目录整理。真正的组件化至少要涉及模块间依赖关系怎么管理CocoaPods本地私有 pod二进制化、模块间通信方式路由协议通知、公共基础库怎么沉淀、以及最关键的业务模块边界怎么划分。我会让候选人画一下他们项目的架构图然后追问三个“为什么”为什么这两个模块之间要通过路由通信不发直接方法调用基础组件层里放的是哪些东西判断标准是什么你们拆组件后编译时间缩短了多少上线的流程有没有变化一问数据二问边界三问收益。能拿出一两个“从多少分钟优化到多少分钟”、“原来发版要几个人配合现在只需要一个人点流水线”这类真实数据的才是真正主导过组件化的人。空谈概念的一问就倒。跨端方案也是评估的热门范围这里我会考候选人“怎么选型”而不是“会不会用”。比如 Flutter 和原生混编候选人说“用 Flutter 重写一个页面很爽”不稀奇能说清楚什么场景适合 FlutterUI 高度定制、跨端需求急什么场景不适合重度依赖于系统能力的东西比如复杂蓝牙交互、地图组件、以及原生和 Flutter 之间的通信边界怎么划分这才是真正有用的宏观判断能力。另外工程化还有一个经常被忽略的点证书与签名机制。候选人如果做过上架应该能讲清楚证书、描述文件、entitlements 之间的关系知道 debug 和 release 的签名区别遇到过“设备 UUID 没加进描述文件导致安装不上”的问题。这些内容不深但能反映候选人是否是完整体验过开发到上架闭环的人而不是只写过业务代码。3.3 从“项目经验”里挖出真实角色很多面试官会问“你做过什么项目”但很少追问细节。我有一套固定的追问链“这个项目你最自豪的一个技术决策是什么”——如果候选人说出来的“自豪点”只是一句“我们用 Flutter 重写了这个页面”那多半是执行者视角真负责人会说“我拍板决定把数据迁移从 A 方案改成 B 方案因为……”“你在这个项目里踩过最大的坑是什么”——能说出具体坑、解决步骤、验证方式的人才有真实的项目深度。“如果让你重新做一遍你会改哪里”——真正的 owner 会毫不犹豫地说出几个改进点只做执行的人会愣住然后说“我觉得做得挺好的”。这套追问链最大的价值是防止候选人简历注水。我之前面过一个简历上写“主导了 App 组件化改造”的人问了十几分钟发现他只写了一两个关键类的代码连组件间路由表的注册机制都讲不明白。这种“听过的都说成自己的”型候选人如果不深挖很容易蒙混过关。4. 排错与性能优化最能暴露真实经验的现场场景理论讲得再漂亮遇到线上问题不会排查工作中依然寸步难行。所以我的面试中一定有一个场景题环节给一个具体的故障描述让候选人像开诊断会一样一步步排查。4.1 场景一内存泄漏的定位链路我给出的描述是“线上反馈说某个页面反复进进出出后App 越来越卡最后被系统杀掉。你怎么定位”低分回答“我猜是循环引用用 Xcode 的 Leaks 看一下。”——为什么是循环引用如果是循环引用为什么 Leaks 可能看不出来中等回答“先复现再用 Xcode Memory Graph 看这个页面的对象是否被释放然后检查是否有定时器、block、delegate 强引用。”——思路对但不够完整。高分回答“先用 Memory Graph 或 Leaks 确认对象是否未释放如果未释放看引用链找到持有者同时检查是否有未置空的 NSTimer、CADisplayLink、NSNotificationCenter observer。每次进入页面 Invalidate timer离开页面移除 observer。另外要确认问题只在特定系统版本存在因为 iOS 11 之后 NSTimer 在 block 模式下有[NSTimer timerWithTimeInterval:repeats:block:]的 API解决了 target-action 模式下 timer 对 target 强引用的问题但如果用了 block API 没留意 block 里的 self还是会有坑。”能走到“先确认根因再谈方案最后谈预防”这条链路的候选人我基本会给出高分因为这套路就是线上真实排查的标准做法。4.2 场景二列表滑动卡顿的性能调优第二个场景“一个图片很多的列表滑动时掉帧严重你怎么优化”这个问题的解法很多维真正的考察点是候选人能想到几层以及每一层是否真的动手调过。我会期待候选人按以下顺序回答先测量帧率用 Instruments 的 Core Animation 或 FPS 工具确认掉帧到多少区分是主线程卡顿还是渲染层卡顿。检查 cell 是否复用得正确有没有在 tableView 滚动的回调里做耗时操作。检查图片加载是不是在滑动时同步解码。图片解码很占 CPU正确做法是异步解码、缩略图加载、或者用ImageIO做渐进式加载。检查有没有离屏渲染比如圆角 阴影同时使用会导致 GPU 大量离屏渲染。正确的做法是用cornerRadius加maskToBounds时要注意性能或改成裁剪好的图片。最后加缓存内存缓存 磁盘缓存的二级缓存设计。能按“测量 → 定位 → 逐层排查 → 验证优化效果”展开的候选人说明实战经验不只是“看过优化文章”而是真的调过线上项目。如果候选人还能主动提到用CADisplayLink的duration计算帧率、或者自己在 App 里埋点做卡顿率监控那我会重点考虑因为这说明他有性能监控的意识而不只是出了问题才去优化。4.3 场景三线上崩溃的排查思路线上崩溃排查是另一个经典考察点这里我会给一个具体的崩溃日志片段让候选人分析。Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000123456789 Termination Signal: Segmentation fault: 11很多候选人第一反应是“野指针访问”这没问题但接下来我会问“如果是 ARC 环境下什么操作会导致野指针怎么定位具体是哪个对象”希望听到的路线是先符号化崩溃日志dSYM 匹配、atos命令还原调用栈确认崩溃线程如果是 EXC_BAD_ACCESS考虑访问了已释放对象可以用 zombies 工具在 Debug 下复现再到代码里检查是否有unsafe_unretained属性、异步回调里访问了已释放的代理对象、或者是通过 C 指针访问了已释放的内存。如果候选人能主动提到NSException和EXC_BAD_ACCESS是两种不同的崩溃类型前者会抛NSException可捕获重签名后者是底层的信号无法用try捕获——这个区分能筛掉一批完全只懂皮毛的人。4.4 网络与基础调试技能不显眼但必须具备网络层是很多评估体系容易忽略的部分但实际上它最能反映日常开发习惯。我会用以下几个点快速摸底是否会用 Charles 之类的抓包工具做网络调试如何查看 HTTPS 请求的明文内容——需要配置 CA 证书能熟练设置的人说明做过联调和排查。线上环境的网络日志怎么收集是否了解 NSURLSession 的 delegate 回调可以拿到指标数据客户端如何校验接口返回的数据合法性防止后端字段类型变更导致崩溃——能答出Codable的decodeIfPresent、map转换、接口层做 DTO 模型的人比直接写data[key] as! String的人靠谱得多。URL Scheme 和 Universal Links 各适用于什么场景在 iOS 13 以上的窗口中打开链接的方式有哪些变化——这是 iOS 生态里“唤起 App”的基础虽然不复杂但能反映候选人是否关注过系统能力演进。这里有个小判断技巧我会关注候选人回答时的“轨迹”。如果他讲网络排错时能提到“先看请求发没发出、再看响应有没有回来、再看解析有没有失败”这种分步思路那他在日常开发里一定是靠“链路定位”干活的人而不是靠猜猜完改一下再试试完不行再猜。5. 候选人高频误区与“一听就是背的”典型回答我长期当面试官之后发现有些回答只要一开口就能判断是背的不是因为“说的不对”而是因为这些回答太“标准”了标准到没有任何个人的东西在里面。这一节我列几个高频误区既是给候选人避雷也是给评估者做参考。5.1 误区一把“避免循环引用”当成所有内存问题的万能解典型回答“这里用 weak 就对了因为 weak 不会造成循环引用。”问题在哪weak 只是解决“两个对象相互强持有导致谁都无法释放”的问题但它不是所有内存问题的万能钥匙。如果你用了 weak但那个持有方本来就该被释放只是对象还没释放你的 weak 变量被自动置 nil业务逻辑就可能出错。“用 weak 保平安”的想法非常危险。正确的逻辑是先分析生命周期weak 是不是真正的解药只是基于生命周期推导出来的一个结果而不是出发点。另外还有一个容易踩的坑delegate 都用 weak 就一定没错吗也不是。如果 delegate 对象的生命周期比设置方更短那 delegate 被置 nil 以后设置方调用 delegate 方法就不响应这也是 bug。所以候选人回答内存问题的时候我越来越重视他有没有“先分析生命周期”的意识而不是第一反应就是改修饰符。5.2 误区二对自动释放池的理解只停留在“用完就释放”典型回答“我把代码放到 autoreleasepool 里里面的对象就立即释放了。”实际情况autoreleasepool的作用不是立即释放而是把池子里的对象从“延迟释放”变成“出池时释放”。在 ARC 下很多临时对象会进入 autorelease pool最迟在 RunLoop 迭代结束释放。手动加池子是起到“提前释放”的作用降低峰值内存而不是让每一个对象立刻释放。这个区别很关键能区分出“看过文章说循环里要加池子”和“真正理解为什么循环里要加池子”的人。5.3 误区三为了架构而架构把简单问题复杂化典型回答“我们项目严格采用 MVVM 路由器 组件化每个模块都拆成文件夹代码都靠协议通信。”问题在哪架构是解决复杂性的工具不是目的。一个只有几个页面的工具 App你强行 MVVM DI 组件化只会让代码量翻倍、追踪问题时多跳好几层。我见过最夸张的一个项目团队为了展现架构能力把一行的label.text xxx写成了 ViewController → ViewModel → Service → Model → 再绕回 ViewModel → View 六层调用最后连自己人都看不懂了。这种简历上写着“架构能力强”的候选人我会特别留意问一句“如果只需要做一个小需求你还用这套架构吗”能回答“小需求可以简化”的说明真的理解架构是权衡硬着头皮说“所有项目都该这样”的我基本会亮红灯。5.4 误区四用“我记得好像”和“应该是”来回答问题这条看起来是最基础的但出现频率最高。面到一半候选人说“好像是这样的”“我印象里是这样的”“应该是吧”我基本会打断他“如果不是很确定可以说说你的排查思路。这个场景如果真遇到你会怎么确认”真做过的人即使某个细节记不清也能给出“我可以先查文档 / 用实验验证”的路径。只会背答案的人一旦忘记某个细节就彻底断片。评估的是工程方法不是记住多少 API 的名字。这条对面试官尤其有价值——不要因为候选人记不清一个 API 名就直接挂掉要给他机会展示他是怎么找答案的。想清楚这个对“技术人会不会用 Google”这个问题也会有新的想法。5.5 误区五只讲结论不讲代价和边界上面反复提到过真正的工程决策是选择 代价。候选人如果整个面试都在讲“我用了什么”而从不提“我牺牲了什么”那这个人在实际工作中大概率是不考虑后果的人。比如组件化后模块间通信变自由了吗没有你换了路由之后跳转没有编译期检查了运行时才发现拼错 URL这就是代价。能主动讲出这种代价的候选人说明他做过复盘。这类人放进团队你用起来会非常省心——他不会把线上问题直接砸你头上而是会先把风险和备选方案写清楚。6. 给评估者的实操建议如何设计一套完整的 iOS 工程师能力评估流程讲完了具体考察维度最后分享一套我在团队里落地过的评估流程。这套流程不能保证百发百中但能显著减少“面的时候觉得不错进组之后天天踩坑”的情况。6.1 三轮面试的差异化定位我建议评估流程至少分三轮每轮的考察重心不同避免一轮面试里既考基础又考架构最后什么都考不透。第一轮电话初筛30 分钟。主要确认经验匹配度、技术栈、做过的业务场景。这轮不必急着出难题重点是筛掉简历明显注水、技术上完全没有交集的人。把 HR 的简历筛选再做一道技术把关。第二轮技术主面90 分钟。按上面说的五个能力层级来设计20 分钟知识快问30 分钟深挖一个项目30 分钟一道现场设计题或排错题最后 10 分钟留给候选人提问。注意这轮不要把所有时间都花在知识点上免得又是背题大会。第三轮交叉面 / 终面60 分钟。一般由更资深的人来面重点考察架构设计思路、跨端选型观、软素质和职业规划。这轮的主要目的是验证第二轮候选人的说法是否一致同时看看这个人是否值得长期培养。如果要招的是初级工程师第二轮就足够了如果是带人的高级岗三轮缺一不可。我之前的教训是中级岗位只面了两轮结果候选人业务能力不错但入职一个月后暴露出和同事沟通很有问题复盘时才发现终面该问的软素质题完全没涉及。6.2 记分卡把评估结构化避免“感觉型面试”我强烈建议每个面试官在面试过程中就用一张记分卡记录证据而不是面完之后凭印象打分。我的模板大致长这样维度具体考察点记录的证据评分1-5语言与运行时属性、ARC、RunLoop、多线程候选人原话追问深度架构与工程化分层、组件、签名、CI/CD项目深挖中的细节排错与性能内存、卡顿、崩溃、网络场景题的排查链路软素质表达、风险意识、复盘习惯行为面试案例综合建议是否推荐 / 适合的职级录用或不足说明这一环节最大的敌人是“光环效应”候选人前面几个问题回答得特别好后面有一个回答明显有问题很多面试官会下意识帮他脑补认为“他应该是会的只是没答好”。记分卡的意义就在于你对着笔记看如果“排错与性能”这一栏整栏空白那你就得在录用前慎重确认这一维度的能力而不是自己脑补出一个满分。6.3 题目设计的三条原则给题目时我坚持三条原则一道题必须有多层次答案。基础、中阶、高阶都能回答但深度不同这样才能区分职级。前面提到的 IM 设计题就是这样什么水平都能答但内容完全不同。优先用候选人简历里的真实项目做素材。不要出一道他完全没接触过的业务场景否则测出来的不是能力而是临场发挥。我会引导候选人“你这个项目里消息列表是怎么处理分页的服务端返回 1000 条数据你会怎么设计”从他的真实实现里挖深度比出一道 10 万人在线的通用设计题有意义得多。不考察“偏怪冷”的知识点。iOS 面试圈有个怪现象喜欢问一些“有没有人知道 iOS 12.1 里某个私有 API 的坑”这种问题这完全偏离了实际工作价值。真正的评估应该聚焦于“3 到 5 年内发展期工程师每天都会用到的知识”而不是冷门边角料。6.4 如果你是候选人可以这样自查最后也写给准备面试的 iOS 开发者。与其临时刷题不如按下面的清单自查一遍基础知识你能否不看文档准确说出 Swift 的 Optional 底层枚举、属性修饰符语义、ARC 下的引用计数规则原理理解你能否把 RunLoop 的机制用生活类比讲给非技术朋友听并且讲清它为什么要这么设计实践能力线上反馈崩溃、卡顿、内存暴涨你能不能画出完整的排查路径项目反思你简历上写的每一个项目能不能扛住 “你最自豪的点” “最大的坑” “重做会怎么改” 三连问边界认知你选的技术方案能说出它牺牲了什么、在什么场景会失效吗我面试过的候选人里能全部满足以上五条的并不多。如果你能做到其中四条已经有很强的竞争力。就算做不到照着这条自查清单去补也能比“背 100 道面试题”管用得多。最后再分享一点我自己的体会。做 iOS 工程师能力评估这件事我最大的感悟是面试官和候选人往往都在玩“表演与识破”的游戏候选人拼命证明自己会面试官拼命找证据证明他会不会。但真正有效的评估不是把对方问倒而是给对方一个真实但不复杂的问题然后观察他用什么路径去解决。解决问题的思维方式才是工程师最值钱的部分。这也是我后来调整所有面试题的核心出发点希望这套方法对你有用。