拓冰建站拓冰建站
首页 / 资讯中心 / 正文

欢聚时代2018校招iOS笔试题解析:核心考点与答题策略

1. 试卷整体设计与考察思路1.1 这套卷子到底在考什么拿到欢聚时代2018年校招的iOS A卷时我第一反应是这套题出得挺规矩的。成都场这份卷子没有太多偏题怪题考察的内容集中在iOS开发最基础也最核心的几个模块OC语言特性、内存管理、Runtime机制、多线程和网络层。这类题目风格在当年很多大厂的校招笔试题里都能看到它不需要你背过某个冷门API也不会追着最新的Swift语法细节死磕而是看你有没有真正理解iOS开发里那些天天在用的东西到底是怎么工作的。为什么说它“规矩”因为你看它的命题逻辑就明白出一套校招笔试题目标不是把人都考倒而是要在短时间内筛选出两类人一类是有扎实基础、能直接上手干活的另一类是简历写得漂亮、但原理一问就露馅的。所以卷子里大量题目看起来是“知识点问答”实际考的是你对底层机制的理解深度。比如weak关键字怎么实现、block什么时候会循环引用、RunLoop和线程是什么关系这些题目表面上是在问语法实际上在考察你有没有读过Runtime源码、有没有真正调试过内存问题。这套题对现在准备iOS面试的同学来说依然有很强的参考价值。虽然时间过去好几年了但iOS底层的东西变化并不大ARC机制、Runtime、RunLoop、GCD这些核心概念依然是面试的必考点。很多公司现在出的笔试题骨子里还是这套逻辑。1.2 题目结构与时间分配的实战判断根据成都场这套卷子的题型分布可以大致判断出命题人的心思。整个卷子一般分为几大块选择题或填空题考察基础概念的准确性简答题考察对机制原理的理解深度代码题考察实际编码能力和细节意识有的卷子还会加一道设计题考察你面对开放性需求时的架构思路。时间分配上我的建议是这样的选择题和填空题控制在20分钟以内这些题会就是会不会就是不会纠结也没用简答题是拿分大头每道题控制在8到10分钟答案组织要有条理宁可少写点废话也要把核心链条写完整代码题每道15分钟左右重点不是写得快而是要把边界条件考虑清楚如果最后有设计题留出15到20分钟这种题看重的是你思考问题的框架而不是最终的方案本身。有同学喜欢在选择题上反复犹豫这个习惯在校招笔试里非常吃亏。校招笔试题量大、时间紧一道选择题的分值通常不高你在上面耗5分钟后面一道15分的大题可能就没时间写完整性价比极低。我的经验是第一感觉选完就走拿不准的做个标记如果全部做完还有时间再回头看。1.3 笔试背后的能力模型我把这套卷子考察的能力拆成三个维度方便你对照自己的准备情况。第一层是记忆准确性。比如问“copy和strong修饰NSString有什么区别”这就是纯粹考你对修饰符语义的掌握答错就是不扎实没有借口。第二层是机制理解深度。比如问“weak指针的原理”你光说“弱引用不会增加引用计数对象释放后自动置为nil”是不够的面试官想知道的是你知不知道Runtime维护了一个全局的weak表对象dealloc的时候会根据地址找到所有weak指针并清空还要知道这个过程中会涉及锁操作。第三层是工程落地能力。比如给一个多线程场景问你用GCD还是NSOperationQueue为什么。这种题没有绝对的对错但你能不能在回答里体现出对任务依赖、取消操作、最大并发数、线程安全这些实际问题的考虑决定了这道题你是拿一半分还是拿满分。大部分校招同学的问题出在第一层很熟练第二层靠死记硬背第三层几乎空白。这份卷子恰恰是把这三个层次混在一起出的所以你复习的时候不能只刷知识点要把每个知识点往深处挖一层再想想它在你实际写代码的时候会怎么影响你。2. 核心考点拆解与答题要点2.1 OC语言特性与内存管理的命题陷阱OC语言这一块笔试里出现频率最高的无非就是属性修饰符的区别、Block的内存管理、Category和Extension的区别、深拷贝与浅拷贝。这些知识点看起来简单但出题人特别喜欢在里面埋坑。先说属性修饰符。一个经典的坑是“用strong和copy修饰一个NSMutableString分别会有什么效果”很多人知道copy对不可变字符串有保护作用但没想过它对可变字符串的影响。如果源对象是NSMutableString你用copy修饰属性再赋值实际上做了一次深拷贝属性指向的是一个不可变的副本。这时候如果你在外部往这个copy出来的对象上调用appendString直接崩溃。反过来如果你的属性是strong只是保留了原对象的引用那么原对象后续被修改这个属性也会跟着变这在某些场景下会造成很难排查的Bug。这类题的答题思路是先明确概念区别再给出具体场景下的表现最后说明使用建议。比如copy修饰NSMutableString的坑合适做法是属性声明为copy、内部接口接收参数后用mutableCopy转成可变副本。这种层层递进的结构阅卷老师一眼就能看出你是有工程经验还是只会背概念。再说Block的循环引用问题。笔试里考这块通常会给你一段代码让你判断有没有循环引用有的话怎么解决。记住一个判断方法从self出发沿着强引用链走一圈能不能回到self。最常见的是block持有selfself又通过属性持有block这就形成了环。解决办法是__weak typeof(self) weakSelf self如果涉及延迟执行还需要考虑weakSelf在block内被使用的时候再转成strongSelf防止执行过程中对象被提前释放。这里有个细节容易被忽略如果block里访问的是self的成员变量编译器会直接捕获self而不是捕获这个成员变量。所以很多人写__weak typeof(self) weakSelf self但block里却直接用self-_name结果还是循环引用。正确写法是先用weakSelf转一遍__strong typeof(weakSelf) strongSelf weakSelf在block内部再用strongSelf去访问成员变量。这个坑在面试的时候就常被拿来做深入追问。2.2 Runtime机制与动态方法解析Runtime是iOS面试的必考板块也是拉开分数差距的板块。基础题会问你什么是isa指针、Class的结构长什么样进阶题就会考消息转发流程、method swizzling的原理、关联对象的实现。消息转发这个知识点是重中之重。我建议你在复习的时候把整个流程画成一条链路然后按链路去记忆消息发送阶段会先查找MethodList和缓存没找到就进入动态方法解析调用resolveInstanceMethod允许你动态添加方法如果还没解决进入快速转发阶段调用forwardingTargetForSelector把消息转发给另一个对象最后进入完整转发流程走methodSignatureForSelector和forwardInvocation。这三个阶段层层递进每一层都有hook的机会。笔试答题的时候建议把这个链路完整写出来然后举一个实际应用的场景。比如怎样用动态方法解析实现一个可选代理方法或者用forwardInvocation来做多继承的模拟。能举例说明你确实理解它的意义分数会完全不同。关联对象这块考的频率也很高会问你objc_setAssociatedObject能不能给Category添加属性。很多人脱口而出“能”实际上关联对象和属性完全是两回事。属性是类结构里真实存在的ivar加setter/getter关联对象只是在运行时用一个全局字典把对象和值绑在一起。所以它能让Category拥有“可以存取的数据”但并没有真正添加ivar。还要知道关联对象有五个管理策略对应assign、retain、copy等语义不写对的话内存管理的坑非常大。2.3 多线程方案的选型与对比关于多线程这套卷子的思路是把考察重心放在iOS开发中最常用的几个方案上NSThread、GCD、NSOperationQueue。只答出各自的基本用法是不够的笔试更想看到的是你手里握着“选型判断力”。先看NSThread它是最底层的线程管理方式需要自己管理生命周期和线程同步实际项目中直接用的不多了但如果问你线程的状态、线程间通信还是需要有概念的。再往下看GCD它基于C语言实现用起来最轻量用block封装任务配合队列管理并发任务。GCD有串行队列、并发队列、主队列还有全局并发队列题目很容易深挖到一个问题同步任务放进串行队列会发生什么死锁。异步任务是怎样的没有问题。你要是搞混了说明对GCD队列调度逻辑还没吃透。NSOperationQueue则在GCD之上封装了任务对象支持取消、设置依赖、控制最大并发数适合比较复杂的业务编排场景。笔试有时候会让你画一个“下载图片→拼接合成→展示”的任务流程图如果换成NSOperationQueue可以给任务A和任务B加依赖写得非常清晰而用GCD实现需要额外用信号量或group去控制细节多得多。2.4 网络层与数据持久化网络层是实际开发中的高频场景笔试出题通常会围绕一个简单需求展开给一个第三方接口地址要求用GET/POST请求获取数据并做数据解析和缓存处理。考察点一般有三块第一NSURLSession的基本用法要知道dataTask、downloadTask、uploadTask的适用场景还要知道怎么设置timeoutInterval和请求头第二数据解析JSONSerialization和现在更常用的Codable有什么区别遇到字段缺失或者类型不匹配怎么处理第三网络策略是否需要重试机制、是否需要断点续传、缓存策略是怎设计的。我见到很多同学在回答网络题的时候喜欢把AFNetworking的源码结构写一大堆然后说自己封装过一个网络层。这其实有点跑偏。笔试题考的是你能不能在不依赖第三方库的情况下用系统API实现一个最小的网络模块并考虑各种边界情况。建议复习时实际手写一次原生的网络请求感受一下callback里对error、data、response三个参数的处理逻辑这对答好网络题非常关键。数据持久化方面必考的是沙盒目录结构Documents、Library/Caches、Library/Preferences和tmp各自的用途。再往上就是NSUserDefaults适合存什么、不适合存什么以及数据库选型SQLite、CoreData、FMDB、WCDB之间的区别。这套题考简单版本的话就是你给一个“登录后保存用户信息”的场景判断应该存在哪里。基本答到“敏感信息用Keychain、普通用户信息可以用NSUserDefaults但是复杂模型尽量用数据库、图片等缓存放Caches目录”这个级别就够了。2.5 UI布局与架构设计关于UI部分这个考点虽然在代码题里出现得少但在简答题和设计题里出现的概率很高。为什么因为UI布局水平能看出一个iOS开发者的基本功是否扎实也直接关系到日常开发效率。2018年的时候Auto Layout已经普及了用Frame布局的时代逐渐过去。笔试可能会给你一个复杂页面问你用Auto Layout怎么实现也可能问你UIStackView的特性和适用场景。回答UI布局题重要的是表达你的布局思路先考虑层级关系再决定约束策略。比如一个页面里有一个图片和一个标题图片自适应高度、标题固定两行高度两者间距保持8pt底部对齐到容器底部。把这个约束关系用代码或文字逐条描述清楚比甩出一大段viewDidLoad里写约束的代码更有说服力。3. 高频题型的答题思路示范3.1 原理题从现象到本质的组织方式原理题是整张卷子的区分度核心。回答这类题我建议你养成“是什么→为什么→怎么用”的三段式结构。比如考weak原理不要只回答“weak弱引用”而是什么是weak它修饰的对象不会增加引用计数并在对象释放时自动置nil。为什么可以自动置nilRuntime维护了一个全局的SideTable表里面有一个weak_table_t结构记录着所有weak指针指向的对象地址和对应的weak指针数组。当一个对象dealloc时Runtime会去weak_table中查找所有指向该对象的weak指针并把它们全部置为nil这样可以防止悬垂指针。怎么用使用委托模式时通常用weak修饰delegate避免循环引用在block捕获列表里使用weakSelf避免循环引用。这个结构答下来阅卷老师基本能看到“这个人读过源码理解到位”。反之如果只写一句“自动置nil”哪怕写对了也很难拿高分。3.2 代码题现场手写要注重边界条件代码题是很多人的心理负担但其实校招笔试的代码题不考算法竞赛级别通常是考你对常用API的熟练程度以及编码细节。比如让你手写一个返回可变数组的copy实现或者写一个将字典转模型的小工具完全不会用到复杂算法纯粹看你的基本功。以“手写一个线程安全的单例”为例正确的iOS单例写法是 (instancetype)sharedInstance { static id instance nil; static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ instance [[self alloc] init]; }); return instance; }答题的时候要注意三个点为什么用dispatch_once保证线程安全且只执行一次为什么用static变量保证生命周期和进程一致以及如果改用同步锁和加锁判断有什么劣势。这些细节只要是老手都懂能把它写出来说明你真的写过。还有一个常见的代码题是手写KVO或通知的移除操作。这种代码不难但容易出错的地方在于KVO观察者移除前要确保对象没有被释放否则会触发crash通知的观察者在dealloc时也要及时移除。代码题考察的往往就是这个“你在真实项目中踩没踩过坑”。3.3 设计题开放式问题如何输出框架设计题是很多同学的噩梦因为题目开放没有一个标准答案。比如让你设计一个IM的消息发送模块或者让你设计一套App的主题换肤方案。这类题目的答题逻辑我觉得可以用一句话概括先把需求边界问清楚再给分层架构最后落到具体实现。你不需要真的写出全部代码但你要让阅卷老师看到你的分析过程。以IM消息发送为例一个完整的回答应该包含消息模型设计消息ID、发送状态发送中/成功/失败、内容、时间戳等。发送流程设计入队→重试机制→失败回调。线程模型设计发送队列放在哪个线程、UI刷新回到主线程。缓存策略聊天记录本地存储发送失败的消息要持久化还是只存内存。扩展性考虑后续增加图片、语音消息应该怎么设计消息体。如果你能把这几个模块都覆盖到哪怕最后没有写任何代码这道设计题也能拿高分。因为考察的正是你的工程思维而不是你的代码量。4. 常见失分点与避坑经验4.1 阅卷视角下的高频失分行为从我在实际项目中带新人的经验来看校招笔试题里最典型的失分点其实很集中。第一类失分是“答非所问”。题目问“block从栈区复制到堆区有什么影响”很多人直接开始讲循环引用讲了一堆最后也没说明白复制前后存储位置的变化。这种答题方式等于把送分题变成了送命题。对策只有一个先审题圈出题目到底在问什么再组织答案。第二类失分是“只背结论不给推导过程”。比如问“为什么atomic不等于线程安全”如果只回答“atomic只是读写安全但复合操作不安全”那就太单薄了。要展开说atomic保证的是属性读写时加锁确保不会出现同时读写导致的崩溃但如果你先读一个值再对它做操作再写回去这个过程本身不是原子的所以两个线程同时执行这段逻辑时仍会产生错误结果。这才是一个能唬住面试官的完整答案。第三类失分是“忽略边界条件”。写代码题的时候很多人只写出主流程却不处理输入为空、数组越界、重复调用等情况。笔试题阅卷时间有限边界处理是阅卷人快速判断你经验水平的信号。哪怕你的主流程写得一般只要边界处理考虑周全得分往往不低。4.2 时间不够时的抢分策略上考场前必须想清楚一件事这套笔试题很可能做不完。与其每一题都写一半不如挑高分题完整答透。先说判断标准代码题的分值通常高于选择题设计题虽然分值高但花费时间也长简答题则是性价比之王。如果时间到了只剩10分钟尽量去补简答题的每个小问哪怕多写几个要点也比在一道选择题上反复犹豫要划算。再说答题顺序。我推荐先做简答题再做代码题最后做选择题。原因是简答题能快速激活知识储备代码题需要你保持专注而选择题做起来不费脑子。但如果你看到后面的代码题特别难不要硬刚跳过去先做后面的设计题把这个题放在最后思考避免一道题卡死全盘。4.3 值得重点补强的知识弱区根据这个阶段历年考生的情况有几个知识点几乎是团灭级别的很多人复习的时候也容易忽略。第一个是RunLoop。很多人知道RunLoop有kCFRunLoopDefaultMode和UITrackingRunLoopMode但问它和线程的关系就说不清了。要记住的是RunLoop和线程是一一对应的主线程的RunLoop默认启动子线程的RunLoop需要通过run方法手动启动。面试题经常结合滑动卡顿来问问你一个定时器在滚动页面的时候为什么不执行明白了Mode的作用分就到手了。第二个是内存图分析。给你一段涉及Block、NSTimer、CADisplayLink的代码让你判断有没有内存泄漏这种题最容易出错。关键点在于NSTimer会对target强引用如果target再持有timer就构成循环引用。iOS 10之后虽然有block版本的timer方法但仍然要注意block内引用self的问题。第三个是iOS的启动流程。从dyld加载到AppDelegate回调整个过程说明了App从点击图标到首屏渲染之间的漫长链条。校招笔试题不一定专门考但一旦考到非常能拉开差距因为大部分同学对这个过程只有模糊概念。4.4 笔试过程中的心态与细节管理最后提醒一些考试过程中的细节。笔试时间有限建议先把题目整体扫描一遍把会做的题标出来先做别在不会的题上死磕太久。写代码题的时候注意变量命名规范和代码缩进即使写在草稿纸上也要用清晰的格式因为有些公司会把草稿纸收上去人工复核。简答题尽量用序号分条回答方便阅卷老师一眼看到你的得分点而不是在一段长文字里找。另外有个小技巧遇到确实不会的题不要留白。把你对这个知识点能联想到的相关内容哪怕只是关联概念也写上去。校招笔试的评分通常是踩点给分多写不扣分留白一定是零分。上面讲的都是有章法的分析最后这个细节是最容易被忽略但最实用的提分手段。5. 从笔试到面试的能力衔接5.1 笔试之后如何准备面试笔试只是校招流程的第一关真正拉开差距的往往是接下来的面试。如果你已经拿到一份iOS笔试题并做完了接下来最该做的不是背更多题而是把笔试里没答好的题目整理成一个知识清单逐个去补。一个我强烈推荐的复习方法写博客或文档。你每弄懂一个知识点用自己的话写一篇技术总结写得清楚说明你真的理解了写不清楚说明还在半懂状态。很多同学以为面试官考察的是累积的知识量实际上面试官更看重的是你表达一个技术问题时的逻辑框架和深度写文档的过程就是在训练这个能力。5.2 从笔试题看真实项目中的技术选型把笔试题做一遍还不够你要能跳出来看为什么公司要出这些题因为这些东西在真实项目里天天遇到。以我自己的开发经验来说iOS项目最常遇到的坑就是内存泄漏和主线程卡顿笔试题就专门挑这些考。现在你做一个即时通信类的App大量消息并发进入怎么保证UI流畅这不就是GCD和RunLoop知识点的组合应用吗。做一个富文本编辑器复杂排版下如何保证输入不卡顿这就是对UI布局和渲染机制的综合考察。所以说校招笔试只是把实际开发中的问题抽象成了纸面题目。你做这些题目的时候不要只想着“怎么答对”要多想一层“如果我在开发中遇到这个问题应该怎么处理”。养成这个习惯你对技术的理解高度就不一样了面试的时候也会自然流露出“有工程经验”的气质而不是一个只会刷题的应届生。根据我过去面试和带人的体会很多拿到Offer的同学笔试成绩并不是最高的但他们在卷面上展现出的那种“每个知识点都有一点超出课本的思考”的特质会给你留下很深的印象。这一点在欢聚时代的笔试中同样适用别追求答得满要追求答得深。这种答题习惯也会在以后的工作里让你不断拉开和周围人的差距。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门