小红书iOS秋招笔试全解析:从底层原理到工程实战
接到小红书2023年秋招iOS开发岗第三轮笔试通知的时候我心里其实有数这一轮基本不是拼刷题量而是拼对一个iOS工程师日常“会不会干活”的理解。第三轮笔试和第一轮海笔最大的区别在于它不再只是选择题和算法题堆砌而是会把你当成一个已经能独立负责模块的初级工程师来考察问的全是日常开发中绕不开的东西底层原理、架构设计、线上问题排查、甚至调试工具的用法。这篇文章我会把当时拆解题目、准备知识点、以及后来复盘总结的完整思路写出来给正在备战类似大厂iOS岗笔试的同学一个参考。1. 小红书秋招iOS笔试解析从第三轮笔试反推岗位画像1.1 三轮笔试的筛选逻辑秋招的笔试通常是层层递进的小红书这种体量的公司笔试设置不是走过场。第一轮往往以基础算法和选择题为主筛掉那些基础不牢、编程习惯差的候选者第二轮开始引入更多工程化场景到了第三轮基本上是在模拟“你入职之后会碰到的真实任务”。我当时看到第三轮发来的邮件正文里没有说太多只给了时间限制和在线编码链接但根据往年经验这一轮除了写代码还会穿插一些文字作答的开放题比如“如何设计一个短视频播放页的内存优化方案”这类。从岗位画像来看小红书iOS开发岗需要的是能独立负责业务模块、有较强的底层问题排查能力、同时对体验细节敏感的人。第三轮笔试就是围绕这个画像出的。不是考你会不会背字典而是考你在真实业务里能不能想到、做到、说到。1.2 核心考察方向与知识地图我花了一个晚上把近两年的面经和笔试回忆题做了归纳发现第三轮笔试的知识点高度集中在下面几条线iOS基础底层Runtime、RunLoop、内存管理、多线程。UI与性能Auto Layout、列表流畅度、离屏渲染、卡顿监控。架构设计分层架构、模块化/组件化、MVVM与数据绑定、混合开发方案选型。代码能力中等偏上的算法题或设计题偶尔会涉及OC与Swift混编。调试与工程化Charles抓包、证书管理、自动化测试、崩溃分析。而且有个很关键的趋势题目越来越贴近“线上问题”。比如不直接问“RunLoop是什么”而是问“一个页面滚动卡顿你怎么用RunLoop的知识去定位”。这种问法背后考察的其实是排查思路和工具链熟练度。备考前一定要把这些工具链知识补齐不然原理背得再熟也答不到点上。2. 底层知识不靠背靠串联2.1 Runtime、Block与内存管理的关联很多同学把Runtime、Block、内存管理分开背但第三轮笔试喜欢把它们串起来出题。比如“在一个Block里修改外部变量为什么需要__block在ARC下Block从栈复制到堆时发生了什么”这类题单考一个知识点不难难的是你能不能在回答里把这些概念串成一条线。我当时梳理了一条主线Objective-C对象本质是结构体每个对象都有isa指针Runtime通过isa找到类对象然后沿着继承链查找方法实现Block本质上也是一个结构体它捕获外部变量时会生成对应的成员变量如果捕获的是对象类型的变量会涉及copy和release操作而这个操作是在Block从栈区复制到堆区时由编译器自动插入的。如果你在Block里修改变量而不加__block捕获到的只是值拷贝修改无效加上__block后修改变量的地址让Block持有这个地址才能做到修改生效。这类题真正要考察的不是你记不记得“__block作用”而是你能不能理解编译器底层为Block做了哪些事情。答的时候最好按“源代码如下-编译后结构体长什么样-内存管理如何介入-ARC下会如何转换”这个顺序来逻辑清楚评分自然高。2.2 多线程方案怎么答才不踩坑多线程题几乎是必考的而且翻车率极高。最容易被扣分的地方不是“你知不知道NSThread、GCD、NSOperation的区别”而是“你在什么场景下选哪个方案”讲得太模糊。我的答题框架是这样的NSThread是轻量级线程封装适合简单开启一个后台任务但需要自己管理生命周期和线程安全GCD是C接口、基于任务队列能轻松处理并发任务和分组回调是大部分并发场景的首选NSOperationQueue是更高级的封装基于GCD但支持任务取消、依赖关系和最大并发数控制适合复杂、可管理、有依赖的业务任务。如果题目进一步追问死锁一定要能现场给出例子主线程上同步执行一个提交到主队列的任务就会死锁。因为主队列是串行队列任务F1执行到这里再提交任务F2要等F1执行完才轮到F2但F1又停下来等待F2执行完两者互相等待线程卡死。另外别忘了提线程安全。数据竞争、原子操作、锁的开销这些概念尽量在答案里带一下尤其要会对比自旋锁、互斥锁在性能上的差异。我在笔试里遇到“多线程下读取同一可变字典如何保证安全”时给出了四种方案从最简单的synchronized到dispatch_semaphore再到os_unfair_lock并说明不同锁的等待机制和开销差异。这种答题密度是单纯背概念给不了的。2.3 网络与数据持久化高频题网络层考察集中在HTTPS握手过程、HTTP/2多路复用、DNS解析、Cookie状态管理以及Charles抓包原理。重点要说清楚Charles为什么能解密HTTPS它本质上是一个中间代理客户端信任Charles的根证书后Charles会与服务器建立一条TLS连接同时与客户端建立另一条TLS连接从而在中间解密并查看明文。真机调试时需要把Charles的证书安装到手机并信任才能抓到HTTPS包。笔试会问这类题说明他们要的是能独立排查网络问题的人而不是只会调AFNetworking的“接口调用员”。数据持久化的话NSUserDefaults适合小量配置Keychain适合保存敏感信息如tokenSQLite适合大量结构化数据CoreData有学习成本但对象管理和内存管理更强FileManager适合文件型数据。回答时多一句“我会根据数据大小、安全性、查询频率来选择”就显得你不是死记硬背而是有工程判断。3. 笔试中的UI题与架构题光会写不够还得会讲道理3.1 从Auto Layout到分屏与StackViewiOS界面上最容易丢分的是Auto Layout到底怎么做性能优化、以及如何理解约束动画。笔试不会让你手写约束但可能给一段代码问“为什么这里更新约束没有动画”或“这个页面在横竖屏切换时为什么会变形”。这里有个关键概念约束系统是按优先级进行的同一组视图如果有互相冲突的约束会降低优先级或打破其中一个约束。想要约束变化有动画不是直接改constant就行而是要先调用layoutIfNeeded再在UIView动画闭包内修改约束再调用一次layoutIfNeeded强制在动画块内重新布局。StackView也是一个送分点它是对UIStackView的封装自动处理排列、间距、对齐。热词里出现的UILayoutStackView基本指的就是UIStackView它是iOS9就很成熟的组件。能用StackView减少约束数量的地方一定要用既减少自动布局引擎的计算量也让代码简洁。iPad分屏适配时StackView的自适应能力会极大减少工作量这也是为什么厂商会关注你懂不懂分屏布局的原因。3.2 iOS分层架构与模块化思路架构题很少直接问“MVC和MVVM区别”而是会抛出一个业务场景。比如“首页信息流有很多业务组件你怎么设计模块化”这其实是小红书这类内容平台非常真实的需求。核心不是让你背架构名词而是看出你有没有分层意识和边界感。我当时准备的思路是四层工具层网络、存储、埋点等基础能力对上层无业务感知、业务中间层账号、搜索、推荐等核心能力可被页面复用、业务页面层承载具体信息流页面的组装和跳转、入口与容器层外部模块接入的壳。模块之间通过协议通信具体实现在编译期隔离。再往后就是组件化和路由比如用URL路由来解耦页面跳转动态下发页面配置来满足运营需求。回答这类题时千万不要只画一堆分层图就结束要拿一个小红书的业务例子落地。比如“笔记详情页的评论区模块如何独立成库如何注册评论组件协议如何与笔记模块解耦”把这个例子讲透了比空谈分层架构有说服力得多。3.3 混合开发方案的选型分析热词里出现“ios混合开发方案”说明现在各个厂iOS岗位都很关心跨端能力。笔试如果有混开发选型题大概率会问你“脚本语言桥接、React Native、Flutter、uni-app你会怎么选”。我的备选框架是这样的React Native适合已有大量前端资源、希望复用Web/React生态的团队但性能瓶颈和长列表优化是硬伤Flutter通过自绘引擎保证UI一致性和高性能适合精细化体验需求但Dart语言和渲染引擎学习成本高uni-app基于Vue语法一套代码发布到App、小程序、H5开发效率很高适合中小团队或中台业务快速上线不过对原生底层能力的依赖较重混合开发时还是需要原生的容器能力。回答时一定要把“原生开发”放在主位说明自己掌握原生技术栈能理解跨端框架的原理、桥接层和性能瓶颈而不是只会写跨端代码。这在今年的背景下尤为重要因为鸿蒙、iOS、Android多端并存厂商更看重你在多端协同时的判断力。4. 实战编程题从纸上谈兵到手写可运行4.1 笔试中的算法题复杂度考的是工程直觉第三轮笔试的算法题难度不会特别离谱但会比较“业务化”。比如“给定一个字符串找出最长不重复子串”、“设计一个支持过期时间的LRU缓存”这类题已经算高频。这类题除了考算法的正确性还会看你的代码规范和边界处理。以LRU缓存为例我拿到题后会先明确数据结构HashMap加双向链表。HashMap负责O(1)查找双向链表负责维护访问顺序。注意要用哑结点头尾避免在删除和移动节点时处理空指针。还有一点Swift里字典的key如果是类对象需要遵守Hashable协议OC里则要注意NSDictionary对key的copy语义。笔试环境在线编译时很容易在这些小细节上翻车。代码写完一定不要直接交卷先手推一个用例。比如容量为2依次put(1,1)、put(2,2)、get(1)返回1、put(3,3)后2应该被淘汰这个用例走通之后心里就有底了。这道题背后的工程含义其实是“缓存淘汰策略”你在面试追问环节如果能顺口提到图片缓存、网络缓存、页面缓存都可以用LRU那就比单纯写代码的人高出一截。4.2 利用Runtime写一道“黑魔法”题有的笔试会出一道看似工程实则是考Runtime的题目。比如“实现一个方法交换两个方法实现且保证调用时不会因为继承链产生意外”。看到这种题说明他们确实在乎底层能力。Method Swizzling的标准写法需要注意三个点第一交换后在load或initialize中进行避免多线程重复swizzle第二交换时要使用class_addMethod做保护防止父类方法被替换成子类实现第三交换完成后记得调用原始实现避免死循环。我还会补充说明swizzle has to be in dispatch_once, 且只能在有完整源码控制的类中使用线上环境要谨慎因为会影响所有实例和类方法。其实这种题考察的是一线开发者的“防疫意识”你知不知道哪些黑魔法会搞崩线上而不是单纯“会不会用”。答题时要既展示能力又守住工程底线这是最加分的。4.3 手写内存泄漏修复代码另一类常考的是“给你一段代码找内存泄漏”。常见陷阱包括Block循环引用、NSTimer未invalidate、delegate用strong修饰、单例持有大对象、通知未移除。以Block循环引用为例笔试里常给这样的代码片段self的block内部访问了self的成员变量同时block又被self的某个属性持有。解决方法是在block外声明weakSelfblock内部再用strongSelf处理生命周期。注意如果block内部有异步操作weakSelf有可能提前释放所以block进入后先strongSelf再判断nil。这个话题还可以延伸到Swift的闭包捕获列表[weak self]和[unowned self]的使用场景区别。unowned适用于闭包生命周期和self一致的情况但如果self在闭包执行前被释放就会崩溃所以很多大厂代码规范里都建议优先使用weak。手写修复代码时还要指出“测试时怎么看泄漏”比如用Xcode的Memory Graph调试器或者Instruments的Leaks模板观察循环引用环。笔试里写出排查链路说明你不只是会背修复模板而是真有排错能力。5. 工具链与工程化能力笔试里隐身但决定成败5.1 从Charles抓包到网络调试很多同学准备笔试时只看算法和原理忽略了工具链。但实际上第三轮笔试常会把工具链知识混在场景题里问。比如“线上用户反馈某个接口请求失败你怎么排查”如果答案里没有Charles、日志、网络层分阶段排查的思路就很容易得分偏低。用Charles做iOS真机HTTP/HTTPS抓包时步骤要完整手机连接电脑同网段Wi-Fi设置HTTP代理为电脑IP的8888端口然后访问chls.pro/ssl下载并安装证书再到设置-通用-关于本机-证书信任设置里把Charles根证书完全信任。这里有个很常见的坑安装了证书但没有在“证书信任设置”里打开开关导致HTTPS解密失败。笔试问到这个细节时能答出来就是亮点。还有“iOS开发者模式”和“证书更新”这类问题本质上是考察你有没有真正打包过App。开发者证书过期或描述文件过期会导致安装失败。正确做法是登录开发者后台查看Certificates、Identifiers Profiles确认证书有效状态重新生成描述文件并下载在Xcode的Signing Capabilities里更新。不用避讳这些操作细节很多应届生没走全过但你写出来就说明真有上架经验。5.2 iOS自动化测试与集成笔试最后可能会加一道“如何保障代码质量”的开放题。这里要提到XCTest、XCUITest、debug断言、CI/CD。小红书的迭代节奏很快自动化测试和持续集成是保证质量的关键。我的理解是XCTest做单元测试重点覆盖网络层数据解析、缓存逻辑、关键工具类XCUITest做UI测试验证核心链路能正常走通。CI/CD通常用Jenkins或GitLab CI签名可以用xcodebuild exportArchive命令行也可以用fastlane管理证书和上架流程。还有热词里的“iOS自动化”千万不要理解成“自动点击脚本就完事”在工程里更多是指回归测试的自动化尤其大厂更看重效率和稳定性。5.3 App启动与电池优化热词里“ios开发 电池优化”值得展开。真实业务里不是所有性能问题都发生在滚动画面上后台任务的耗电和性能跟踪同样重要。笔试如果问电池可以从三方面答后台任务尽量利用系统合适的API比如BGTaskScheduler而不是直接常驻线程定位、蓝牙等传感器用完必须释放不能长期占据避免频繁的重复性网络请求和定位请求能合并就合并。蓝牙连接参数规范也值得了解比如对CBPeripheralManager设置连接间隔、超时时间、广播数据如果连接后没有及时取消会导致App持续活跃耗电和发热都会增加。这在做智能硬件互联的公司里是必考细节小红书不一定考但作为iOS生态知识体系中的一环了解它的机制会让你面对开放题时更从容。6. 我踩过的坑和复盘出的备考建议6.1 笔试失利的最常见原因我梳理了身边同学的反馈发现失利的三个高频原因一是原理背得很熟但业务场景题答得空洞比如问“线上卡顿你怎么办”答半天全是“降低CPU占用、减少离屏渲染”这种万能句子——没有数据支撑、没有定位路径、没有工具验证二是算法题只写核心逻辑边界条件和内存管理完全不管在一些“工程化”判分细则上被扣得厉害三是时间分配失衡前面开放题字太多后面代码题时间不够为了收尾只能提交半成品。针对第一种情况我的经验是准备“问题定位模板”描述现象 - 假设原因 - 用工具验证 - 修复 - 回归。拿滚动卡顿举例可以这样答先用Instruments的Time Profiler定位CPU耗时函数再用Core Animation模板查离屏渲染排查是否有大量圆角裁剪和shadowPath缺失然后对可复用Cell做缓存和预布局。这样的答案比“避免卡顿”具体一百倍。6.2 时间分配与答题节奏第三轮笔试的时间一般不会太宽裕我的建议是把做题分成三个时间段。开头的10分钟先把所有题目扫一遍判断题目的难度和分值不要直接埋头写第一题。中间主要精力给代码题代码题最好先写简单实现再优化不要一上来就写最复杂的方案。最后20分钟一定要留白检查检查是否有越界、是否有强引用循环、是否能编译通过另外开放题的句子有没有逻辑硬伤。如果某道题一时没有思路不要死磕。可以先跳过把后面能拿的分拿了再回头想。我那次笔试有一道设计题一开始完全没头绪后来做完其他题再回看才想到用组件化的思路去拆解最后顺利答完。笔试考的不只是知识也是心态和取舍能力。6.3 从笔试通过到offer心态上要调整成什么样过了笔试之后后面的面试大概率会追问笔试里写的方案。所以笔试不管写了什么都要有“复盘意识”把每一道题的解题思路再整理一遍特别是架构题和开放题。你写到卷子上的方案面试官真的会认真看我后来在面试里就被问到过“这个模块化方案你在实际项目中验证过吗”。不要为了卷面好看而堆砌“高大上”的概念。字节和快手喜欢问性能优化小红书这类内容社区会更在意业务细节和体验指标所以笔试答题时最好能往内容场景上靠一靠。比如图片缓存优化“评论区头像统一尺寸、预解码、内存缓存和磁盘缓存分层”比单纯写“用NSCache”高级得多。最后再分享一个小技巧每次笔试前我会把自己整理的FAQ表格再过一遍包括“iOS 11.0及以上/Android 4.0及以上/HarmonyOS Next 5.0及以上”这类多端版本兼容问题。多端兼容是未来任何一个C端App都逃不掉的事你答题时体现出对系统版本差异的敏感度招聘方会格外放心。准备到这种粒度笔试通过只是一个开始面试时你也会从容很多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →