网易2018校招iOS笔试题复盘:核心考点与面试避坑指南 📅 发布时间:2026/8/31 19:46:44 👁 浏览次数: 1. 试卷全景网易2018校招iOS笔试到底在筛什么人1.1 题型构成与分值分布先把这份试卷的整体框架捋出来。2018年秋招那阵子网易的iOS笔试卷在牛客和各大面经合集里流传得挺广我前后刷过好几遍也和一起投递的同学对照过答案。根据流传版本和回忆整理这套卷子大体包含三类题目客观选择题、简答/填空题、编程题。选择题约20道覆盖语言基础、内存管理、多线程、网络、Runtime、编译链接等简答/填空3到5道通常是代码输出题或者概念解释题编程题1到2道以链表、字符串、二叉树这些传统数据结构的题目为主部分场次会穿插一道UI/系统相关的场景设计题。题型数量建议用时常见覆盖范围客观选择题15-20道30分钟OC/Swift语法、内存语义、并发编程、网络协议简答/填空3-5道30分钟代码输出、概念辨析、Runtime相关编程题1-2道40分钟链表、二叉树、数组偶尔混入系统设计时间分配上有个很实际的建议选择题控制在每题一分半以内拿不准的先标记跳过不要恋战。编程题留足40分钟先想清楚边界条件再动手码完至少留5分钟自查空指针、越界等常见问题。1.2 从考点分布看能力模型这份卷子最大的特点是不走偏门考察范围基本就是iOS开发日常工作的核心知识面。但它的狡猾之处在于每道题都往深处挖了一层。比如考属性修饰符不是简单问atomic和nonatomic的区别而是会让你判断一段多线程读写代码是否安全考KVO不是让你背API而是问底层的isa-swizzling实现考GCD也不是问什么是串行队列而是让你分析一段嵌套同步任务为何死锁。我统计了流传版本中选择题的考点分布大致是语言基础含OC和Swift占三成左右内存管理占两成多线程占两成剩余三成分布在网络、Runtime、UI渲染、编译链接等领域。这个分布其实很有代表性它对应的是一线业务开发中最容易出问题、也最能反映工程师基本功的几个方向。1.3 为什么2018年的题放到现在依然值得刷一个很自然的疑问是都过去这么多年了iOS都从11迭代到17、18了Swift也从4走到了5.9、6.0刷这份老卷子还有意义吗我的看法是不仅有意义而且性价比很高。理由有三。第一这套笔试卷覆盖的是iOS开发的核心基础ARC的内存管理语义、RunLoop的机制、GCD的队列模型、Runtime的消息发送这些东西从iOS 8到iOS 18底层架构没有本质变化属于十年不过时的知识。第二网易笔试的风格代表了一类大厂校招的常规考察方式——不追求偏题怪题而是把基础知识点组合出深度这种方式至今仍被广泛使用。第三通过一份结构完整的试卷来对照自己知识体系里的盲区比漫无目的地刷面经高效得多。你可以把这份试卷当作一面镜子照出自己哪些地方是真正理解哪些地方只是背过结论。2. 核心考点逐题复盘语言、内存与底层原理2.1 Objective-C 与 Swift 双语言考察2018年那会儿Swift 4刚发布不久iOS开发正好处于OC和Swift并存的过渡期。网易的笔试卷很典型地反映了这个时代特征——两门语言都会考而且特别喜欢考两者交互时的细节。关于OC部分有几个考点反复出现。Category能否添加属性可以声明属性但不会自动生成成员变量和getter/setter需要通过关联对象Associated Object手动实现运行时绑定。这道题考察的是对Category编译期行为和Runtime机制的联合理解。还有一个很经典的题目Block是如何捕获外部变量的普通局部变量是值捕获__block变量是引用捕获而静态变量和全局变量是直接指针访问。你光知道这个还不够面试官可能会追问为什么block里修改局部变量要加__block因为block本质是一个结构体捕获变量时会把这个变量的值复制到结构体里不加__block的话你在block内部修改的只是那个拷贝值外部根本感知不到。Swift部分的考点集中在值类型与引用类型、可选型、闭包捕获列表、String裁剪、mutating关键字等。有一个题很有迷惑性Swift中的Array是值类型但为什么有时修改一个数组另一个数组也会变这涉及写时复制Copy-on-Write机制——多个变量共享同一份底层存储只有发生写操作时才真正复制。笔试考这个题其实是在考察你是否理解Swift值类型的底层实现而不只是背下值类型传递是拷贝这一句话。说一个我当时踩过的坑有一道代码输出题给了个Swift闭包捕获变量的例子我按OC的思维直接判断输出结果踩了闭包是引用捕获的坑。Swift闭包默认捕获变量是引用语义和OC的__block类似所以循环里创建的闭包如果捕获了循环变量最终打印出来的全是最后一个值。这类细节不写代码是记不牢的。2.2 内存管理ARC 不是内存安全的免死金牌内存管理是网易这套卷子的重头戏几乎是必考板块。核心方向有三个循环引用、weak/strong实现原理、autoreleasepool与对象生命周期。循环引用是每年必出的大题。考察形式通常有两种判断一段代码是否会产生循环引用或者给出代码让分析如何修复。最常见的三个循环引用场景是Block、Delegate、NSTimer。Block捕获self时如果self又持有这个block就会形成环NSTimer被runloop强持有target又强持有self如果不主动invalidate也会泄漏。修复手段倒是一致Block里用weakSelfNSTimer改用block方式并在dealloc或viewWillDisappear里invalidate。但笔试的坑往往在于有些场景你以为没环实际有环有些场景你认为有环但系统已经帮你处理了。比如dispatch_after里持有selfblock执行完就释放不会长期循环但如果在block里又持有了一个被self持有的对象仍然有风险。weak和strong的实现原理也是一个经典考点。weak引用不会增加引用计数当指向的对象被释放时weak引用会被自动置为nil。底层是Runtime维护了一张全局的Weak表用对象地址作为keyvalue是所有指向该对象的weak指针地址数组。对象释放时Runtime会遍历这张表把所有weak指针置为nil然后从表中移除。理解这个原理能解释很多现象比如为什么weak指针在并发环境下也可能读到非nil却又很快变成nil以及为什么不能对weak修饰的变量直接声明为getter返回。还有一个容易丢分的知识点是copy与mutableCopy的区别。很多人只记得不可变对象copy返回自身mutableCopy返回可变副本但笔试喜欢换个马甲来考NSArray用copy修饰和strong修饰在赋值一个NSMutableArray时分别是什么行为。copy修饰会让NSMutableArray失去可变性后续addObject会崩溃strong修饰则保留可变性但外面一旦修改原数组属性也会跟着变。正确答案取决于你的设计意图但笔试卷的标准答案更倾向于为了防止外部篡改属性应该用copy这层理解。注意autoreleasepool也是高频考点。主线程RunLoop会在每个事件循环结束时自动释放池所以有些耗时操作会产生大量本该回收的临时对象。笔试常考的是大量循环拼接字符串或创建临时对象时为什么要手动加autoreleasepool因为每一轮循环产生的临时对象不会立即释放直到当前RunLoop周期结束才统一释放内存峰值会飙升。手动加池子可以将释放时机前移降低峰值。2.3 Runtime 与 RunLoop底层原理类的送命题网易笔试卷对Runtime的考察深度在当年的大厂校招里属于比较有代表性的。常见题目有这么几类。类对象与元类。isa指针指向什么实例对象的isa指向类对象类对象的isa指向元类元类的isa指向根元类形成一条完整继承链。meta-class存在的意义是让类方法也能走消息发送机制。选择题有时会让你画类继承体系下的方法查找路线这就考察你是否真的理解对象方法、类方法、类方法在元类上的查找顺序。消息转发机制。当调用一个不存在的方法时系统依次执行resolveInstanceMethod、forwardingTargetForSelector、methodSignatureForSelector、forwardInvocation。笔试常见的变体是让你在resolveInstanceMethod里动态添加方法问能否解决unrecognized selector崩溃。能解决因为消息转发第一步就被拦截了但前提是你真的用class_addMethod把方法加到了类上。更隐蔽的考点是消息转发的前两步如果解决不了第三步返回nil会发生什么直接崩溃。KVO底层实现。KVO的机制简单说就是系统动态创建一个子类重写被观察属性的setter方法在setter里调用willChangeValueForKey和didChangeValueForKey然后把实例的isa指针指向这个子类。这里有一个隐藏考点使用KVO后对象的class方法返回什么答案是返回原类因为KVO的子类重写了class方法隐瞒了真正的isa指向。所以当你试图用isKindOfClass判断类型时不会出问题但用object_getClass获取真实类时看到的是NSKVONotifying_原来的类名。RunLoop也是简答题的常客。考察点包括RunLoop的运行模式Default、Common、Tracking等、事件循环的机制、Timer在滚动时为什么暂停、如何让NSTimer在UIScrollView拖动时继续回调。核心答案是ScrollView拖动时主线程RunLoop切换到UITrackingRunLoopMode而默认创建的Timer注册在kCFRunLoopDefaultMode下所以被暂停了。解决办法是把Timer加入到NSRunLoopCommonModes或者用dispatch_source定时器。2018年的卷子还喜欢问performSelector和Timer的关系这背后还是RunLoop的mode问题。2.4 多线程GCD 与锁的十连问并发编程在笔试中基本是必刷板块。网易的题目不算难但覆盖面广几乎把GCD、NSOperation、锁机制都问了一遍。GCD部分的高频题有这么几个。同步任务和异步任务。dispatch_sync和dispatch_async在串行/并行队列上的行为特别容易考。当你在主队列上调用dispatch_sync会直接死锁因为主线程在执行同步任务时被阻塞而任务又等着主线程执行互相等待。同理在串行队列里再同步派发到这个串行队列也会死锁。这个知识点我当年第一次见时没想明白后来画了个线程等待的图才真正理解。dispatch_once。这个函数底层通过原子操作和信号量实现保证代码块只执行一次是单例模式的推荐写法。笔试有时会问dispatch_once能否在子线程安全使用可以它本身就是线程安全的。还会问如果把一个耗时操作塞进dispatch_once其他线程会怎样答案是全部阻塞等待直到onceToken被标记为已完成。信号量与线程安全。dispatch_semaphore经常用来控制并发数和加锁。比如同时发起多个网络请求等全部完成后统一刷新UI就可以用信号量加dispatch_group实现。笔试常考信号量的初始值、wait和signal的配对关系以及用信号量模拟锁时如何防止死锁。NSOperation的部分主要考察operation间的依赖关系addDependency、最大并发数maxConcurrentOperationCount、取消操作cancel和KVO监听状态。它和GCD的核心区别是NSOperation是面向对象的抽象多了取消、依赖这些高级能力但底层依然由GCD调度。锁机制在2018年那套卷子里已经有苗头近几年更是面试重灾区。考察范围包括NSLock、synchronized、OSSpinLock后来被指不安全替换为os_unfair_lock、pthread_mutex、dispatch_semaphore以及Swift里的DispatchQueue和NSLock组合。有一道题问多个线程同时读写一个可变数组用什么方案最安全答案不是NSLock而是用串行队列或读写锁因为要区分读操作和写操作的性能差异。这类题没有标准到唯一的答案考察的是你是否理解不同锁的适用场景和性能特点答题时要体现出取舍的逻辑。3. 编程题与算法题如何在40分钟内写出让面试官点头的代码3.1 高频率算法题型盘点网易笔试的编程题不搞ACM那一套超纲算法集中在链表、二叉树、字符串、数组这些基础结构上难度大概是LeetCode中等偏下的水准。这其实反映了业内共识校招工程师不需要在算法上达到竞赛水平但基础数据结构得扎实边界条件得想得全。从流传版本的题目来看链表相关题目出现频率最高比如反转链表、判断有环、找中间节点、合并两个有序链表二叉树次之层序遍历、前中后序的非递归遍历、求最大深度、判断对称二叉树都出现过字符串和数组则集中在最长公共前缀、两数之和要求O(n)复杂度、去重、旋转数组等。有意思的是偶尔还会出一道iOS场景相关的编程题比如实现一个简单的LRU缓存虽然不直接考iOS API但LRU在图片缓存、内存缓存中都有实际应用题目背景很符合移动端工程师的日常思考方式。3.2 一道手写编程题的完整拆解反转链表以反转链表为例把笔试现场的分析思路完整过一遍。题目描述一般就一句话反转一个单链表。要求迭代和递归两种方式都要会。迭代写法是面试中最稳妥的方案。核心思路是维护三个指针prev记录前驱节点cur记录当前节点next临时保存下一个节点防止链表断掉。每次循环做三件事先保存next再把cur的next指向prev然后prev和cur整体往后移动最后prev就是新的头节点。func reverseList(_ head: ListNode?) - ListNode? { var prev: ListNode? nil var cur head while cur ! nil { let next cur?.next cur?.next prev prev cur cur next } return prev }递归写法更简洁但需要想清楚递归的终止条件和返回值。递归调用的返回值是反转后的新头节点在回溯过程中把当前节点的下一个节点的next指向当前节点再断开当前节点原来的next指针防止形成环。func reverseListRecursive(_ head: ListNode?) - ListNode? { guard let head head, let next head.next else { return head } let newNode reverseListRecursive(next) next.next head head.next nil return newNode }我在笔试现场踩过两个坑。第一个是忘记处理空链表和单节点链表guard语句没写直接导致空指针异常第二个是递归写法里忘记把头节点的next置为nil结果返回结果正确但链表内部形成了环后面遍历直接死循环。这两个坑在LeetCode上其实都能通过常规用例但要到链比较长或者结果被二次使用时才暴露。所以写完代码之后一定要手动模拟一次至少用3个节点的链表顺着跑一遍。3.3 代码之外的隐形扣分项编程题不是代码写对就万事大吉笔试系统虽然不像面试那样人工盯着但有一些隐性规则会影响你的得分。命名要能看懂。有些人习惯用单字母变量名比如n、p、q虽然逻辑没错但如果阅卷老师人工复核理解成本会高很多。我自己的习惯是变量名尽量语义化比如prevNode、currentNode既方便自己捋逻辑也方便复盘。边界条件的处理是最大的加分项。空数组、长度为1的数组、所有元素相等、目标值不存在、链表只有一个节点这些情况都要主动考虑。很多笔试系统会用隐藏用例来测边界代码逻辑再对边界一崩得分直接打对折。还有一点很容易被忽略代码的复杂度。笔试系统有时会限制超时虽然不会明说但如果你写的算法是O(n²)而预期是O(n)在数据量大的用例上会因超时被判错。特别是数组去重、两数之和这类题目最优解是什么、暴力解法是什么心里要有数。两数之和的O(n)解法用哈希表思路是遍历一次每到一个数就查map里是否存在target减当前数。这个思路不仅代码量少而且笔试现场容易验证正确性。4. 网络层与架构设计题检验你是不是只会写界面4.1 网络层的考点深度移动端开发免不了和网络打交道所以这套笔试卷里网络相关的题也占了相当比重。考察方向很明确HTTP协议基础、网络安全、移动端网络实战问题。HTTP基础和面试问法几乎是一样的。GET和POST的区别不是简单说一个参数在URL里一个在Body里而是幂等性、缓存机制、历史语义和使用场景的综合理解TCP三次握手为什么要三次本质是确认双方的收发能力都正常HTTPS的握手流程核心是证书验证、密钥协商非对称加密交换对称密钥、后续通信用对称加密。这些题在2018年出现到现在依然是iOS面试的高频题因为移动端App的几乎所有业务都建立在HTTP/HTTPS之上。Cookie和Session也会考。移动端不像浏览器有完整的Cookie管理机制NSURLSession默认自动管理Cookie但如果遇到需要手动管理登录态的场景呢这就延伸到了Token机制。笔试喜欢考Cookie和Token有什么区别为什么移动端更常用Token答案是Token有无状态、跨端共享方便、可以自定义过期策略而Cookie受域名和浏览器策略限制在App内管理起来反而别扭。DNS解析也偶尔客串。当年有个热门问题为什么页面第一次加载很慢第二次就快了表面是缓存实际上是DNS解析结果被缓存。更深一层的考点是HTTPDNS它把域名解析从运营商的LocalDNS挪到了自建DNS服务上避免域名劫持和调度不精准问题。这个知识点在2018年的卷子里不一定直接考但作为简答题的加分项是很好用的。4.2 网络框架设计题怎么答有一种开放题特别能拉开分差如果让你设计一个App的网络层你会考虑哪些方面表面上看没有标准答案但阅卷人心里有一套隐含的评分标准。我当时的回答思路分四层。第一层是基础封装请求方法的抽象、GET/POST支持、请求头和参数的拼接、响应数据的统一解析。第二层是错误处理网络错误、业务错误、HTTP状态码要分清楚分别对应不同的提示和重试策略。第三层是缓存策略哪些接口可以本地缓存、缓存多久、离线时能否展示缓存数据。第四层是高级能力请求优先级、批量请求、取消重复请求、流量监控、弱网模拟。如果要说得再细一点可以补充一个实际方案基于NSURLSession做一层封装用协议定义请求模型用泛型处理响应解析用拦截器统一处理鉴权、日志、埋点。这里不要求你写出完整代码但要有逻辑闭环——数据从哪来、往哪去、失败怎么办、缓存怎么管理。多写一层思考分数就多一截。4.3 iOS架构相关考点架构设计题在2018年已经出现近年来越来越重要。网易这套卷子里的架构题通常不会太深更多是基础概念的辨析和场景判断。MVC、MVP、MVVM三者的区别是必背项。MVC的Model和View不能直接通信全部通过Controller中转缺点就是Controller越来越臃肿MVVM引入了View Model层把视图状态和业务逻辑从Controller中抽离配合ReactiveCocoa或RxSwift可以实现数据和视图的双向绑定。笔试常考的是在MVVM模式下View如何响应Model变化答案是ViewModel监听Model的更新再通过绑定机制通知View刷新。组件化和模块化也是那个时间段的热门考点网易这类大厂尤其喜欢问。如果让你把项目拆成多个组件你会怎么定边界核心是通信方式的选择是直接用路由URL还是用Protocol还是直接用依赖注入每种方案都有取舍路由解耦彻底但调试困难Protocol有编译期检查但管理成本高依赖注入清晰但使用门槛高。答题时不需要选边站但要能分析出不同方案的适用场景。还有一道题我记得很清楚Autolayout的约束和Frame布局优缺点对比。这题看着简单但很多人忽略了性能角度。用约束布局核心是求解线性方程组约束越多求解越慢所以在Table/CollectionView这类滚动视图里如果布局简单很多时候用Frame或者纯代码布局反而性能更好。这种题考察的是你在真实业务中做技术决策的能力而不只是背书。5. 常见错题与避坑指南那些丢分最可惜的题目5.1 选择题里的经典陷阱网易这套选择题里有几个考点几乎每场都有人翻车我把它们单独列出来。对象为nil时发送消息。在OC中给nil发送消息不会崩溃消息会被静默忽略。但这个方法调用如果返回一个对象或数值返回的是nil或0。经典题目是NSArray *array nil; NSUInteger count array.count;问count的值是多少。答案是0因为给nil发消息返回0。这个知识点是OC和Swift的重要区别Swift里对Optional为nil时直接调用方法会编译报错或者运行时崩溃。两道题对比着考往往是卷子里的送命组合拳。weak指针的置nil时机。一个对象在dealloc过程中weak指针是什么时候变成nil的很多人以为是dealloc开始的时候实际是更晚准确说是在objc_clear_deallocating这个阶段也就是dealloc执行接近尾声时。所以如果你在dealloc方法里访问这个对象的weak引用它可能依然是有效指针只是指向的对象已经开始释放了用完有风险。这个细节我在面试时被追问过一次至今记忆深刻。atomic到底安不安全。atomic只保证读写原子性保证的是单属性的setter和getter线程安全但不保证整个对象的安全更不保证数组增删元素的安全。经典陷阱题是一个atomic修饰的NSMutableArray在两个线程里同时addObject会崩溃吗会的因为addObject包含多次读写操作atomic管不了这个。copy修饰NSMutableArray和NSMutableDictionary。这是选择题的重灾区。用copy修饰的NSMutableArray实际类型是NSArray一旦调用addObject会直接崩溃。所以在OC中NSMutableArray、NSMutableDictionary、NSMutableString这些可变类型属性修饰符应该是strong而不是copy。但NSString是个特殊情况它规范做法是copy因为防止外部传入NSMutableString后内容被篡改。5.2 编译与链接的冷门知识点除了运行时的知识点网易笔试卷偶尔会考一些编译和工程相关的冷门内容。这类题做对了容易拉分做错了也不至于伤筋动骨但如果能掌握会给整体印象加分。静态库和动态库的区别算一个。静态库在编译链接时被打进可执行文件App包变大、启动快动态库则是在运行时被加载包体积小、启动慢但需要处理动态库依赖和签名问题。选择题问法可能是App启动时动态库的加载顺序是什么这是一个链路比较长的题涉及dyld的加载流程如果没专门看过很难答全。Podfile的install流程也是常考的工程题。很多人天天用CocoaPods却不清楚pod install时到底做了什么。核心链路是解析Podfile和Podfile.lock、拉取源码或二进制、生成Podfile.xcconfig、修改xcworkspace、集成Pods工程。了解这个流程对排查“改了Podfile但不生效”这类问题很有帮助——很多时候你忘了pod install或者改了版本号但Podfile.lock没更新行为就和预期不一致。Apple后来推的Swift Package Manager也有类似机制考察方式会在简答题里出现SPM和CocoaPods的区别是什么。答案的核心是SPM是Apple官方方案、基于源码依赖、构建集成更透明而CocoaPods是第三方社区方案、生态更成熟、支持本地和二进制依赖。两个方案各有优劣没有绝对的谁更好答题时能清晰对比就是加分项。5.3 答题策略与时间分配笔试除了考知识也考时间管理。我当年的策略是拿到卷子第一件事不是做题而是用两分钟把整张卷子扫一遍标出哪些题是送分题、哪些题是中等题、哪些题需要花时间。选择题部分遇到完全不熟悉的题目先凭直觉选一个然后标记起来不要在单题上耗超过两分钟。简答题和填空题重点在于把核心概念写清楚不用追求篇幅但要把“是什么、为什么、怎么解决”三者写到位。编程题一定要先写核心逻辑再补边界条件如果时间不够伪代码或者注释也要写上让阅卷人看到你的思路是完整的。还有一个很实用的技巧编程题不要一上来就写最优解。先用暴力解法把题目做对再优化到最优解。很多人在笔试时为了装点门面直接写最优解结果边界错了得不偿失。我自己的顺序是先写一个能跑的版本哪怕时间复杂度高再分析哪里可以优化最终提交优化版本。6. 从笔试到offer如何把这份试卷变成你的备考地图6.1 用知识点清单做能力自检一份试卷最大的价值不是做完对答案而是帮你校准知识体系。我建议把上面提到的所有考点整理成一张自检表每一条都问自己几个问题能不能说出原理能不能手写demo验证能不能跟面试官聊五分钟领域核心考点自检标准语言基础Category关联对象能说出runtime关联对象的API和生命周期内存管理Block循环引用能写出weakSelf的完整场景和修复代码底层原理KVO实现机制能画出isa-swizzling的流程并发编程GCD死锁能分析串行队列嵌套sync为什么会死锁网络HTTPS握手能说出证书验证和密钥协商的完整过程架构MVVM能结合实际场景分析MVVM的优缺点算法链表反转能手写迭代和递归两种方式并说出边界每一项如果达不到标准就单独抽时间补。补知识的方法不是背结论而是写一个最小demo去验证。比如不理解KVO底层就建个测试工程重写子类、观察class方法、打断点看调用栈跑一遍比看十遍文档都有用。6.2 笔试准备的时间线与资料推荐关于备考节奏我的经验是分三个阶段。第一阶段把基础知识点系统过一遍参考书不用多但要认真读。iOS开发者文档、Apple官方《Programming with Objective-C》、Swift编程语言官方文档都是必读的中文社区里有很多整理好的面试题集锦也能帮快速扫盲。第二阶段集中刷题LeetCode的链表、二叉树、数组、字符串四类题足够应对大部分笔试每天保持2到3道的手写练习量。第三阶段全真模拟找一份完整的笔试卷给自己定60到90分钟模拟考试环境做一遍再花一倍时间复盘。资料方面我不推荐贪多。书的话iOS核心知识的经典书一本就够算法用LeetCode加剑指Offer足够文档以Apple Developer官方文档为准面经可以作为补充但不要当成权威教材。核心是形成自己的知识脉络而不是收集无数条碎片化的知识点。6.3 复盘方法错题本怎么记才有效大多数人记错题本的方式是低效的直接把错题和正确答案抄一遍过两天就忘。我的方法是三步法。第一步记录题目本身和你的错误答案同时写清楚错误原因。是知识点没学过、学过忘了、还是理解偏差错误原因决定了后续的补强方式。第二步写出完整的答题思路不是只写正确答案而是把自己当时的思考过程写出来再对照正确答案找出认知偏差出现在哪一环。第三步记录一个可以验证这个知识点的迷你实验。比如理解错了循环引用就写一句“用Instrument的Leaks跑一遍Demo验证”理解错了RunLoop就写一句“用CFRunLoopObserver观察一下mode切换时的回调”。这个三步法的核心逻辑是把一道错题变成一个学习项目让知识点从“背过”变成“验证过”。我在秋招后期最大的感受是真正留下深刻印象的知识点不是在面经里看来的而是那些我亲手跑过demo、踩过坑、又在笔试里答错之后才彻底弄懂的。说点掏心窝的话。每次复盘这套2018年的题目我都觉得它像一份浓缩的iOS开发基本功地图上面标着的知识点绝大多数到现在依然是面试官高频追问的点。如果你现在正处在准备秋招的阶段不妨把它当成一次能力体检考了多少分不重要重要的是把每一道错题背后缺的那块知识补上。我当时用完这份卷子之后最大的收获不是记住了哪道题而是建立了一种复习方法知识点一律用代码验证不再靠背结论糊弄自己。这套方法论到了我后来带新人、做技术方案评审的时候依然在用。