ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

爱奇艺iOS笔试B卷深度解析:从OC底层到视频缓存设计

爱奇艺iOS笔试B卷深度解析:从OC底层到视频缓存设计 爱奇艺2019秋招iOS方向笔试题B我在好几个技术社群里都看到有人讨论这套卷子。作为一个面过视频类大厂、也参与过校招出题的老iOS开发我拿到这份题的第一反应是这才是正经考察iOS功底的卷子不是靠刷LeetCode就能糊弄过去的。整套题从OC语言底层到多线程、网络、内存管理再到跟视频业务紧密结合的开放性设计题覆盖面很广而且有相当多细节是只有真正写过项目、踩过坑的人才能答得上来。这篇文我打算彻底拆一遍这套卷子它会考什么、背后的考点逻辑是什么、哪些是送分题哪些是分水岭以及每类题如果我自己做会怎么组织答案。同时也聊聊这份题对现在准备iOS秋招的人有什么参考价值因为即使是2025年的今天这套题的考察内核依然不过时。1. 笔试题整体设计与考察逻辑拆解1.1 题型结构与时长分配的合理性整套B卷的题型分为三大块客观题单选、多选、简答/代码补全题、以及最后的开放性设计题。从题目编排来看爱奇艺的出题思路并不是单纯考记忆而是试图在两个小时左右的时间里快速筛出三类人基础不扎实的、只会背八股文但写不了代码的、以及真正有工程思维的人。客观题大约占40%的分值覆盖了OC语法、Runtime、KVC/KVO、Block、内存管理规则、GCD和NSOperation、网络层HTTP/HTTPS等iOS面试的标配知识点。简答题和代码题占40%这部分不是让你背诵而是给你一段有坑的代码让你指出问题并修复或者在特定场景下写出多线程同步的代码。最后的开放性设计题占20%考的是系统设计能力比如让你设计一个视频缓存模块或者播放器需要怎么处理弱网切换。这个分值分布反映出爱奇艺作为视频类App对iOS工程师的期望基础功底必须扎实但光扎实还不够还要能围绕业务做技术方案。笔试只是第一道门槛但它能把那些简历写得天花乱坠、一上机就露馅的候选人迅速筛掉。1.2 考点背后的岗位能力画像我认识几个在爱奇艺iOS团队的朋友从他们平时的工作内容来倒推这套题会非常有意思。视频类App的iOS端有几个绕不开的技术痛点播放器性能优化、视频缓存与下载管理、弱网环境下的用户体验保障、页面流畅度与内存占用控制、日常Debug和线上问题排查。这套笔试题的考点几乎都能映射到这些真实业务场景。比如内存管理考察得细是因为视频App在播放高清视频时图片解码、视频帧缓冲、列表页大图加载每一环都可能造成内存暴涨甚至OOM。多线程考得深是因为一个视频播放器要同时处理渲染、下载、UI刷新、用户操作线程间协作与同步是家常便饭。网络层考HTTPS和TCP是因为流媒体传输对网络质量极其敏感工程师不懂网络层就无法排查播放卡顿和加载失败的问题。我见过很多候选人把OC的property属性关键字背得滚瓜烂熟但问他如果一个对象在子线程中被释放会发生什么就一脸茫然。前者只需要记忆力后者才需要真正理解引用计数的机制。这套卷子恰恰就喜欢以这种原理衍生题的方式来拉开差距。1.3 B卷与A卷的差异化定位严格来说爱奇艺秋招笔试通常同时出A、B两套卷难度和侧重点会有差异。A卷往往更偏通用iOS技能B卷则会更贴近公司业务技术栈和深度问题。做B卷时你会感觉到有些题目如果没写过视频类或IM类App光靠刷题库是很难答到点子上的。举个例子B卷中的开放设计题大部分围绕视频缓存弱网播放流媒体下载管理出题。如果你在项目里做过离线缓存、断点续传、后台下载这些功能那你答题时会有非常具体的方案可讲。如果没做过就只能给出网上通用的缓存队列并发控制式回答深浅一目了然。所以B卷对已经有实习经验或者做过完整项目的同学有明显优势这也符合大厂秋招的逻辑校招不仅看潜力更看你上手能不能干活。2. 客观题模块深挖OC语言与Runtime高频陷阱2.1 分类、扩展、代理与通知的应用辨析这套卷子的选择题里必然会出现分类Category和扩展Extension的区别、代理Delegate和通知Notification的使用场景这些老朋友。看起来基础但出题人会设置一些容易混淆的表述来挖坑。比如给你一段代码问分类中声明了一个同名方法主类里也实现了运行时到底调用哪一个。这里的关键是Runtime的方法决议顺序。分类的方法会被追加到类的方法列表前面所以同名方法调用时分类的实现会覆盖主类实现但没有真正替换主类的方法依然在方法列表中。如果你在分类中调用了[super xxx]它是不会走到主类实现的这一点很多人栽过跟头。代理和通知的题目除了考一对一、一对多这种表层的区别还常喜欢考循环引用。比如代理用weak还是assign修饰为什么通知的观察者在iOS 9之前需要手动移除现在系统会在dealloc时自动清理但如果用了block回调的观察者仍需注意捕获self导致的问题。2.2 KVC与KVO的底层机制与触发条件KVO键值观察在笔试中的出题率相当高。爱奇艺的题一般不满足于考KVO怎么用而是深入到底层KVO是基于Runtime动态生成子类NSKVONotifying_XXX重写被观察属性的setter方法在setter里调用willChangeValueForKey和didChangeValueForKey来触发回调。所以它要求属性必须支持KVC而且只有通过setter方法或KVC修改值才会触发直接改成员变量不会。有个高频陷阱题对同一个对象添加多个观察者或者对同一个keyPath添加两次观察会怎样触发回调如果对象在子线程设值回调会在哪个线程执行KVO的回调线程取决于setter调用的线程这一点笔试里很多人会默认当成主线程。还有一类题是如何手动触发KVO答案是在willChangeValueForKey和didChangeValueForKey之间做属性赋值或者直接调用这两个方法即使值没有变化也能强制触发回调。这类细节如果不是源码级地看过KVO机制很难答全。2.3 Runtime消息发送与消息转发流程iOS的Runtime绝对是笔试题的分水岭模块。印象很深的一道题当向一个对象发送一个不存在的方法时系统会按什么顺序寻找实现最终如果找不到会发生什么抛出unrecognized selector异常。然后是消息转发的三个机会动态方法解析resolveInstanceMethod、快速转发forwardingTargetForSelector、完整消息转发methodSignatureForSelector forwardInvocation。这套流程背下来其实不难但B卷能把它考出深度。比如给你一段代码类A实现了消息转发把某个方法转发给类B对象让你写出类的改动点或者反过来给你一个crash堆栈问是哪个阶段没处理好才走到了doesNotRecognizeSelector。这种题需要你真正理解消息发送的完整路径而不是只记住几个方法名。另外Runtime还常考isa指针和对象内存布局比如Tagged Pointer、isa的位域存储。有一个经典题一个NSNumber对象它的指针值和内存地址有什么关系为什么小数字的NSNumber不占用堆内存。这个知识点在性能优化相关题目中也经常被引用。2.4 属性关键字与内存管理细节属性关键字是iOS笔试必考题B卷不仅考记忆还考组合场景。比如用copy修饰的NSMutableArray向它添加元素会发生什么crash因为copy返回的是不可变NSArray用strong和weak在block中捕获self的区别atomic真的线程安全吗为什么说它只能保证读写完整性不能保证业务逻辑线程安全。这里我建议用绕不开的表格来梳理common答案笔试答题时也会比较清晰关键字组合底层实现典型使用场景常见误区nonatomic copysetter先copy再赋值NSString、NSArray、NSDictionary以为copy会做深拷贝nonatomic strongsetter先retain再赋值普通对象持有不处理外部可变对象的情况weak不retain对象销毁自动置nildelegate、block捕获以为weak适用于所有场景assign不retain不置nilCGFloat、BOOL、int用于对象会造成野指针还有一个深坑是block的存储区域全局块、栈块、堆块。在ARC下栈块会自动拷贝到堆上所以很多人没意识到栈块的存在但如果是非ARC的题目或者在block里使用__block变量就会牵扯到栈上变量捕获与逃逸的分析。B卷针对这块出过一道要求分析代码输出的题选项就是循环引用崩溃/正常打印/输出空值。3. 多线程与内存管理大题代码补全与Bug定位3.1 GCD并发队列与线程爆炸问题爱奇艺这套B卷在多线程大题上非常喜欢出用GCD实现某种需求的代码补全题。比如并发下载多个视频分片全部完成后统一合并或者多个接口并发请求全部返回后再刷新UI。这类题的标准解法是dispatch_groupdispatch_group_notify或者dispatch_barrier_async做栅栏控制。但B卷更高级的地方在于它会进一步追问如果并发数量很大怎么办。很多候选人会用for循环往全局并发队列里丢几百个任务这在面试官看来是个雷。正确的思路是使用dispatch_semaphore控制最大并发数或者使用NSOperationQueue的maxConcurrentOperationCount。我经常在文章里强调一句话GCD是C语言级别的API它没有取消任务的概念一旦你丢进并发队列任务就没法撤销了。这在视频下载场景里是很实际的问题——用户点击取消下载你如果只用GCD就得靠自己维护一个任务状态标记在block被调度时检查这个标记来决定是否真正执行。B卷的代码题如果你能主动补充这层考虑分数会明显不一样。3.2 循环引用的典型场景与检测手段内存管理部分印象最深的是一道找出以下代码中的循环引用并给出修复方案的题。给的代码大概是一个ViewController里有Timer或者Block回调block内部使用weakSelf后又在代码块中把weakSelf赋值给strongSelf并调用其方法。这个写法的逻辑是防止weakSelf在代码执行过程中被提前释放是weak-strong dance的标准姿势。但出题人会在里面埋雷。比如strongSelf声明在block的某个作用域大括号内部结果代码块后续又直接用weakSelf调方法或者在一个延迟执行的block里用dispatch_after如果使用了strongSelf就会延长对象的生命周期导致ViewController在pop之后依然被持有一段时间。还有一类循环引用陷阱题非常经典NSTimer以block方式添加之后如果Timer被UIScrollView的滚动模式UITrackingRunLoopMode影响而不触发用户怎么解决。这个题背后的实质是RunLoop的Mode问题而不是简单循环引用。你需要在NSRunLoopCommonModes里添加Timer并且记得在dealloc里invalidate。笔试中如果遇到这类题建议先回答问题把检测手段也写上去用Xcode的Instruments-Leaks工具或者Insomnia工具检查循环引用链或者用__weak断点法。这些细节会让人觉得你不是只会背概念而是真做过内存优化。3.3 锁机制与线程安全实现我发现B卷多选题里特别喜欢把几种锁放在一起考synchronized、NSLock、NSRecursiveLock、NSConditionLock、dispatch_semaphore、os_unfair_lock、自旋锁。让你选出哪些会导致死锁哪些有性能问题哪些适合什么场景。synchronized的滥用是重灾区。它用法简单但底层是捕获一个objc_sync_enter/exit的递归锁性能开销大而且如果锁的对象是nil锁就会失效。笔试真题是给出一段高并发调用synchronized(self)的代码问性能瓶颈在哪、怎么优化。如果你能答上用dispatch_semaphore替换、以及注意加锁粒度这道题就稳了。关于自旋锁要特别注意几个版本问题OSSpinLock在iOS 10之后因为优先级翻转问题被弃用底层改成了os_unfair_lock。但很多旧项目里还有OSSpinLock的代码笔试会问你觉得这有什么问题。不要只答性能好要答出它因为忙等busy-wait导致的高功耗和优先级翻转风险。3.4 block底层结构与变量捕获规则代码补全题经常出的一道题定义一个block在其内部修改局部变量的值直接编译报错问为什么以及怎么解决。考的是捕获列表的规则。这里我会用一个小示意图的逻辑来说明但不画图用文字讲block内部可以访问但默认不能修改外部局部变量因为捕获进来的变量是一个副本值拷贝。要修改必须把变量声明为__block类型这样block捕获的是一个结构体指针才能做到同时修改。对于OC对象来说block对__strong对象是强引用对__weak对象是弱引用这就涉及到循环引用了。有一个进阶题会问block作为属性用copy还是strong修饰。在ARC下block属性声明为strong和copy效果一样因为编译器会自动做copy操作把这个栈上的block拷到堆上。但面试官要考察的是你是否理解block初始在栈上需要copy才能安全存放这个底层逻辑。4. 网络层与常用系统框架在视频业务中的映射4.1 HTTPS与TCP握手的深度问答网络题是视频类App笔试题的重头戏。B卷的客观题部分必然有几道关于HTTPS的题目比如HTTPS握手过程中客户端如何验证服务器证书TLS 1.2和TLS 1.3在握手流程上的区别或者CA证书链的验证过程。TCP三次握手在这里也会考但不是单纯记忆而是跟实际业务结合。比如视频播放器在弱网环境下频繁卡顿你从TCP层面怎么分析这个问题需要你考虑拥塞控制、窗口大小、超时重传等因素。如果你对TCP的Nagle算法、延迟ACK这些有了解会加分很多。我面试人的经验是70%的候选人能把三次握手、四次挥手画出来但只有20%的人能解释清楚TIME_WAIT状态为什么需要2MSL以及大量短连接请求时大量socket处在TIME_WAIT状态会导致什么后果。B卷就有类似的扩展题它希望你不只是看面经而是真正抓过包、处理过线上连接问题。4.2 DNS解析与HTTPDNS优化对于视频App来说DNS解析是影响首屏加载速度的重要环节。B卷有一类题用户在某个网络环境下访问视频列表特别慢ping域名发现解析出来的IP是错的或者超时你会怎么排查和优化。标准答案链是本地DNS缓存污染/劫持 - 使用HTTPDNS方案替代传统LocalDNS - 客户端向HTTPDNS服务器发起请求获取正确的IP列表 - 然后直接通过IP访问并在Header中带上Host字段。这套方案在爱奇艺这类视频App中确实有应用场景因为它能有效避免DNS劫持和解析延迟。笔试中遇到这种题我不建议只回答用HTTPDNS这五个字而应该展开讲如果HTTPDNS解析失败怎么做降级fallback到LocalDNS、缓存策略如何设计什么时候刷新、TTL如何设置、多个IP之间如何做择优通过连接速度和丢包率打分。这些细节才是视频业务需要的工程能力。4.3 NSURLSession与缓存策略的配合iOS端的网络层核心考点围绕NSURLSession以及NSURLConnection为何被废弃展开。选择题会考会话配置类型defaultSessionConfiguration、ephemeralSessionConfiguration、backgroundSessionConfiguration的区别。其中backgroundSessionConfiguration对视频下载App非常重要它支持在App进入后台后由系统接管下载任务这个知识点在实际业务中非常实用。缓存策略也是一个重点NSURLRequest的缓存策略useProtocolCachePolicy、reloadIgnoringLocalCacheData等与NSURLCache如何配合。我遇到过一道题一个接口数据变了但客户端一直显示旧数据问可能的原因和解决方案。很多人能想到服务端加Cache-Control头但客户端侧需要设置正确的缓存策略或者在请求时通过reloadRevalidatingCacheData之类的策略做条件请求这个更细致。4.4 视频业务特有的网络坑点笔试中网络部分的高分回答往往体现在对视频业务特有的问题域有认知。B卷会问如何实现视频的断点续传下载播放过程中如何做预加载码率切换时如何平滑过渡弱网下如何优先保证音频流畅而不是缓冲太久。这些问题本质都是网络层配合业务层做取舍。我自己在项目里踩过一个坑下载视频分片时如果单个分片失败会导致整个下载流程终止。正确做法是给每个分片设置独立的重试机制并且用最大失败次数来标记该分片失败而不是全盘中断。B卷如果出了多分片下载的容错设计能答到这个程度会非常出彩。5. 代码题实战从数组、字符串到并发处理5.1 高频手写题一字符串逆序与字符统计笔试中的代码题爱奇艺偏重实用一般不会出太偏的ACM竞赛题而是考察基本功。比如给定一个字符串统计每个字符出现的次数按照次数从高到低排序输出这种。解题时要注意空间复杂度是O(1)的字符表ASCII 128位数组还是O(n)的字典用字典的keySet排序在面试中也很常用。更进阶一点是判断一个字符串是否为合法IP地址IPv4这题在iOS笔试里出现频率很高因为考察字符串拆分、边界处理、数值范围判断。我会在解题过程中重点考察候选人的边界意识比如前导零01.2.3.4不合法、数值超过255、空字符串段等。对于这类题我不建议只给出能过测试用例的解法而是要在注释里写清楚每一步的意图。因为阅卷人看的不是最终答案对不对而是你的编码习惯和思考严谨性。5.2 链表类与数组类算法实际笔试题感受B卷还有一种代码题是链表反转、链表是否有环、两个有序数组合并。这类题在iOS笔试中出现频率虽然低于纯语言题但作为基本功考察绝对够格。链表反转题我会严格区分迭代和递归两种实现因为递归实现虽然简洁但在处理大链表时会有栈溢出风险。笔试中如果时间允许我建议两种都写或者至少写迭代版并在说明中提一句递归的缺陷。这种细节会让阅卷人觉得你明白工程可靠性。数组合并题我通常用双指针法从尾部开始合并避免额外开辟数组空间。这个技巧在iOS内存优化场景中有映射因为大数组的拷贝和重排代价昂贵能在原地操作就不要新建对象。5.3 多线程综合编程题并发控制多线程的代码题是B卷的重头戏。最常见的出题点是模拟一个场景多个任务并发执行所有任务完成后在主线程执行后续操作。标准解法是dispatch_group_enter/dispatch_group_leave/dispatch_group_notify。但我见过很多候选人在enter和leave不匹配的问题上栽跟头导致group永远无法释放。我推荐在代码中加上dispatch_semaphore来控制并发上限。比如有100个下载任务但你只希望同时进行5个用semaphore初始值为5每个任务开始前wait结束后signal。这两者结合既保证了任务完整性又防止了线程爆炸。还有一道经典题在并发环境下实现一个线程安全的计数器。如果你的第一反应是atomic那这道题只能得一半分因为atomic只能保证属性的原子读写无法保证读取-加1-写回这个复合操作是原子的。正确思路是使用os_unfair_lock或dispatch_semaphore包住整个操作。5.4 从笔试代码到工程实践的差距很多候选人笔试代码写得还算流畅但一到面试聊项目就露怯。因为笔试代码追求的是正确而工程代码追求的是可维护、可扩展、可测试。B卷的设计题如果你能体现这种工程思维会非常加分。比如视频缓存设计题不要上来就写代码而是先画功能模块图内存缓存层、磁盘缓存层、下载任务管理层、播放器对接层再定义接口协议再讨论并发控制和磁盘空间管理。我会建议答题时按照需求分析 - 架构分层 - 接口定义 - 核心实现 - 异常处理的顺序来组织文字这样阅卷人能看到你的完整思考过程。6. 开放性设计题的答法以视频缓存与播放器为例6.1 视频缓存模块的架构思路B卷开放设计题常出现的题目是请你设计一个iOS端的视频缓存系统。这道题没有标准答案但答题的思路和层次感非常重要。我的答法一般分四层第一层是存储层内存缓存用NSCache支持自动回收磁盘缓存用文件系统为了保证磁盘空间需要设计LRU淘汰策略。第二层是任务管理层每个视频的下载任务包含多个分片分片队列通过信号量限制并发数任务状态机覆盖了等待、下载、暂停、失败、完成。第三层是播放器接入层缓存模块与播放器的接口需要做到播放器不知道数据来自网络还是缓存也就是代理模式。第四层是对外API层提供预加载接口、查询缓存状态接口、手动清理接口。不同层次的候选人写出的答案深度完全不同。有工程经验的人会讨论同一个视频被多次预加载怎么办播放到一半用户切换码率未完成的分片怎么处理缓存目录被系统清掉后内存索引如何重建等边界问题这些都是我在真实项目中踩过的坑写进答案里会明显提升说服力。6.2 弱网播放与卡顿优化方案另一个常考设计题是如何优化弱网环境下的视频播放体验。这道题其实考的是网络和播放器两个领域的交叉理解。我的切入点包括首屏秒开起播前先加载几秒关键帧、渐进式播放播放器边下边播进度条显示缓冲区间、自适应码率根据当前网络带宽选择合适清晰度、音频优先弱网时优先保证音频流畅视频帧可丢。从iOS层面来说CGAffineTransform、AVPlayer的automaticallyWaitsToMinimizeStalling属性、资源加载器AVAssetResourceLoaderDelegate的自定义缓存逻辑都是可以展开的技术点。我会重点说明在AVPlayer中如何通过resourceLoader实现本地缓存与远程播放的打通因为这是视频类App面试的核心加分项。6.3 App架构与模块化分层设计除了业务模块设计B卷偶尔也会出一道如果让你从零搭建一个视频App的iOS端架构你会怎么设计的综合题。这类题通常考察的是对MVC、MVVM、组件化、依赖注入的理解以及你是否具备全局视野。我的思路是分层底层是网络层基于NSURLSession封装统一处理鉴权、日志、缓存、存储层数据库文件缓存、中间层是业务服务层播放器服务、用户服务、搜索服务上层是页面层ViewViewModel。同时在工程层面用CocoaPods或SPM做组件化拆分模块之间通过Protocol进行通信避免相互依赖。如果时间充裕我会补充一些性能监控的考虑崩溃上报、卡顿监控、启动时间统计、网络状态记录。这些虽然不是笔试必问但能体现出你对大型App工程质量的理解而不是只会堆页面。7. 常见问题速查表与错题重灾区7.1 笔试中反复出现的高频错题集我把历届候选人错得比较多的知识点整理成一张速查表方便你们复习时重点自查知识点错误理解正确认知ARC下的strong和weakstrong会自动置nil只有weak会自动置nilstrong不会copy修饰可变对象copy做深拷贝对于NSMutableArraycopy返回不可变数组是浅拷贝atomic线程安全atomic保证数据安全atomic只保证单属性读写安全复合操作不安全block捕获外部可变对象block里修改对象属性可行可行因为对象本身是指针拷贝但修改指针指向不行dispatch_barrier在并发队列中随便用必须使用自己创建的并发队列用全局并发队列无效果KVO自动触发在dealloc里不手动移除会崩溃iOS 9之后系统自动清理但block回调仍需注意HTTPS握手只需要服务端有证书客户端也要验证证书链防止中间人攻击7.2 答题时间分配的实战建议整套B卷的考试时间一般是120分钟。我的建议时间分配是客观题控制在40分钟内因为选择题靠记忆不需要反复纠结简答题和代码题控制在50分钟内这部分需要动手写要留足思考和调试时间最后的开放设计题30分钟这部分拼的是思维框架先把骨架写出来再补细节。如果遇到某道客观题卡壳不要停留太久先选一个最可能的答案并标记题号最后有时间再回来检查。因为笔试的竞争在于总分不是单题满分。我见过很多候选人把时间耗在了一道多选题上结果后面的代码题只写了一半非常可惜。7.3 复盘方法论如何基于错题做知识补全笔试结束后的复盘比做题本身更重要。我建议把错题按知识点分类整理到自己的错题本里尤其关注原理类错题。比如为什么atomic不能保证线程安全这种题如果错了不要满足于记住答案而是去读一下objc_getProperty和objc_setProperty的源码实现理解了底层逻辑后这类题无论怎么变形你都能答上来。还有一个常见误区是只刷题不写代码。笔试里的代码题必须亲手在Xcode里建工程跑一遍不要只在纸上或者记事本里写。因为很多语法细节、内存管理问题只有跑起来才会暴露比如block捕获self的循环引用、NSMutableArray的copy陷阱这些在编译器警告和runtime日志中都能看出来。手写一遍和跑一遍是完全不同的学习体验。7.4 面试官视角阅卷时最看重什么作为参与过校招阅卷的人我说几句交底的话。笔试阅卷不是只看最终答案而是看你如何推导出答案。代码题尤其如此如果你的思路清晰、逻辑严谨即使有个别笔误得分也不会低。反过来如果你只写了一个最终结果没有中间推导过程阅卷人很难给你高分。关于设计题最忌讳的是只写口号比如我会用组件化我会做缓存但没有具体落地方案。阅卷人想看到的是接口定义、类设计、数据结构、异常处理、性能考量这些实体内容。你写得越具体越能证明你真的做过而不是背了一套面经模板。另外一个容易被忽视的点是代码风格和命名。即使是非编译的伪代码好的命名规范和注释习惯也会给阅卷人留下好印象。我建议所有候选人养成在笔试中写注释的习惯哪怕只是简单的一句话也能展示你的工程素养。8. 结合真题谈后期复习方向与实战心得8.1 从B卷反推iOS知识图谱如果你正在准备iOS秋招不要死记一份iOS面试题大全而是应该像我前面分析的那样从大厂的笔试题反推他们需要的知识图谱。B卷的知识图谱大致是OC语言底层Runtime、Block、KVC/KVO占25%内存管理与多线程占25%网络与系统框架占20%算法代码题占15%系统设计题占15%。我会按照这个比例来分配复习时间。不要把所有时间都砸在LeetCode上反而忽略了OC语言底层和内存管理这些iOS核心领域。毕竟笔试的目的是筛出能干活的人不是招一个纯算法工程师。8.2 项目经历如何反哺笔试答题有项目经验的人答B卷设计题时优势太明显了。比如你做过视频类App的缓存模块那设计一个视频缓存系统这道题完全就是送你分的你可以直接把你项目的架构、踩过的坑、优化的点写上去。所以我建议备考阶段尽量把项目中的关键模块用文字梳理出来形成一套自己的技术讲解稿。具体做法是挑出项目中两到三个最有亮点的模块分别从背景、方案、踩坑、优化、结果五个维度写清楚。笔试遇到类似的设计题直接复用这套逻辑框架。我自己就是这么准备的效果比临时想答案好十倍。8.3 模拟笔试训练的具体做法有些同学平时学得很好一上考场就紧张做不完题。这需要靠模拟笔试来脱敏。我建议考前至少做两到三套完整的模拟笔试卷严格按120分钟计时手机关机模拟真实环境。模拟的时候不要偷懒代码题必须完整写出来并跑通。我见过太多人在模拟阶段偷工减料逻辑都懂一到考场细节错漏百出。笔试的残酷之处在于代码题目不会因为你有思路就给你分必须写出能编译通过的代码。平时练得严考场才能稳。8.4 我做这类题的一些个人习惯最后说一点我个人的答题习惯。拿到B卷之后我不会按顺序从第一题做到最后一题而是先花2分钟整体浏览一遍全卷标记出哪些是会的、哪些是模糊的、哪些完全不会。做题顺序是先做有把握的客观题再做会写的代码题最后才啃模糊的设计题。这样可以保证把自己掌握的分都拿到手再去挑战不确定的题。代码题我习惯先在草稿纸上画一下数据流和边界条件再开始写。尤其是多线程和缓存设计这类题如果不先在纸上理清思路很容易写着写着发现设计有漏洞。写在纸上的过程也是整理思路的过程这个习惯帮我避免了很多返工。对于不确定的客观题我会在选项旁边写下自己的推理过程哪怕最后选错了复盘时也能知道自己的思维盲区在哪里。这个习惯让我在后来的面试中也受益因为很多面试官就是看你的分析思路而不是要一个标准答案。写在最后爱奇艺2019秋招iOS方向笔试题B虽然已经过去好几年但它代表的考察逻辑和知识框架仍然值得今天的求职者认真对待。我自己当年准备秋招的时候也刷过不少大厂的笔试真题最大的体会就是笔试不靠押题靠的是对iOS底层原理的系统性理解加上实实在在写过的项目经验。如果你正在准备iOS秋招可以拿这套B卷当一次自我诊断看看自己在OC语言底层、内存管理、多线程、网络层这几个板块里哪个最薄弱就集中补哪个。不要只刷题不看原理更不要背答案不写代码。技术这行没有捷径你写过的每一行代码、踩过的每一个坑都会在笔试和面试中体现出来。祝大家秋招顺利。
返回列表