资讯动态

360 iOS校招笔试客观题复盘:内存管理、Runtime与多线程考点精讲

发布时间:2026/8/31 14:13:07 来源:尧图企业网站定制
2019年那场360的iOS校招笔试是我整个秋招季做得最纠结的一场。倒不是因为题目有多偏而是它把很多你以为自己会的东西全用单选题和多选题的形式翻来覆去地问了一遍。整理这套360公司2019校招笔试iOS开发工程师客观题合集的时候我最大的感受是它跟LeetCode那种纯算法题不一样它真正想筛的是你对iOS基础、内存管理、并发、网络这些知识有没有形成体系化的理解。这篇文章不是给你原题答案而是把那个时期笔试中反复出现的考点、易错点、和做题思路掰开揉碎讲清楚适合正在准备iOS校招、或者想补基础的人。1. 360校招笔试的题型结构与时间分配1.1 客观题占比与答题时间怎么安排先说题型。我记得很清楚那场笔试是在牛客网的系统上做的整套题分成几个部分除了行测和性格测试技术题里给iOS开发工程师准备的主要是客观题具体包括单选题、多选题和判断题。题量不小大概在70到90道之间时间却只给了120分钟同时还要顾上编程题。如果你不提前分配好时间很容易在客观题上耗到心态炸裂。我当时给自己定的策略是行测部分快速过不要纠结因为那部分大家都差不多技术客观题才是重头戏。客观题里单选题通常是50道左右多选20道左右判断题10道左右。单选尽量控制在45分钟内多选留30分钟判断和检查15分钟剩下30分钟留给编程题。这个时间分配不是拍拍脑门定的因为单选虽然多但大部分是概念题看选项基本能判断多选才是真正区分水平的地方一旦多选漏选错选都要扣分必须留够时间慢慢核对。另一个容易被忽略的点是做题顺序。我建议先做判断题和单选题再做多选题。判断题短平快能帮你快速进入状态单选题能帮你回忆更多知识点为多选题提供上下文最后做多选题时你已经回忆过一轮思路会清晰很多。千万不要一上来就死磕多选容易在一个选项上卡太久。1.2 从真题分布看考察方向准备这套题之前我特意把牛客网上能找到的历年360 iOS笔试题都扫了一遍发现客观题的知识点分布其实挺有规律。大致可以分成下面几块考点模块大概占比常见题型Objective-C语法与Foundation25%单选、多选内存管理与ARC20%单选、判断Runtime与RunLoop15%单选、多选多线程与网络20%单选、多选UIKit与界面布局10%单选算法与数据结构基础10%单选这个表格不是官方数据是我根据自己刷题之后归纳出来的但足以说明问题iOS开发工程师的笔试不只看你会不会写界面更看重你对语言底层和系统机制的理解。尤其是内存管理和Runtime几乎是每年必考、一考就错的重灾区。后面我会专门用一章来拆这两个模块。还要注意这年笔试里也混进了一些C语言基础题比如指针、结构体、内存对齐这种。虽然题目标的是iOS开发工程师但计算机基础部分不会完全缺席特别是对C语言和指针的考察很多iOS考题都是包了一层OC的壳骨子里还是C语言功底。复习的时候别只顾着看Swift和OCC语言的基础要有意识地补一下。2. iOS基础考点深度复盘OC语法与Foundation高频题2.1 这些OC语法题真的会考OC语法在客观题里的考察方式不是要你写代码而是给你一段代码让你判断结果或者找出问题。这里头最经典的就是属性修饰符组合。比如这道很像真题的题property (nonatomic, copy) NSMutableArray *array;问向这个属性赋值一个NSMutableArray对象后再调用self.array addObject:...会发生什么A. 正常添加元素B. 崩溃因为对象变成了不可变NSArrayC. 编译时报错D. 不确定取决于编译环境正确答案是B。这道题考的是copy修饰符的底层行为对可变集合执行copy得到的是不可变副本。所以属性类型声明成NSMutableArray但实际放进来的对象是NSArray调用addObject会直接崩溃。很多人看到这个题第一反应是copy不就是深拷贝吗深拷贝之后还是可变数组吧这就错了。深拷贝和可变性是两个维度。copy默认返回的是不可变且不可变的副本mutableCopy返回的才是可变副本。集合类遵循NSCopying和NSMutableCopying两个协议copy调的是NSCopyingmutableCopy调的是NSMutableCopying。所以结论很简单如果属性需要可变集合正确写法是property (nonatomic, strong) NSMutableArray *array;但在赋值时要注意外部是否传入了不可变对象必要时手动mutableCopy。再有一道高频题是category和extension的区别。这个题一般会出成以下关于Category的说法正确的是A. Category可以添加成员变量B. Category可以添加实例方法C. Category可以覆盖类方法D. Category的load方法会在主类load之前调用正确选项是B和C。Category确实可以添加实例方法、类方法甚至可以覆盖主类同名方法但它不能直接添加成员变量也没有自动合成setter/getter。至于load方法调用顺序是先主类后category这个顺序跟initialize不一样。顺便说一句Category中声明属性是可以的但不会自动生成实例变量你得配合关联对象objc_setAssociatedObject才能让setter/getter生效。很多同学栽在这个点上因为它太反直觉了。2.2 Foundation框架里最容易混淆的APIFoundation的考题更多落在字符串、数组、字典这些常用类的行为差异上。比如下面这道经典的深浅拷贝题NSMutableString *str [NSMutableString stringWithString:hello]; NSString *copyStr [str copy]; NSString *mutableCopyStr [str mutableCopy];问copyStr和mutableCopyStr分别是什么类型A. 都是NSMutableStringB. copyStr是NSStringmutableCopyStr是NSMutableStringC. 都是NSStringD. copyStr是NSMutableStringmutableCopyStr是NSString答案是B。对于可变源对象copy得到不可变对象mutableCopy得到可变对象。这个结论反过来也成立对不可变对象执行copy返回的是同一个对象因为不可变对象没有必要再拷贝一份对不可变对象执行mutableCopy返回可变对象。笔试里特别喜欢把这个逻辑倒过来问或者把数组替换成字符串选项排列组合目的就是看你是不是死记结论而不是真正理解拷贝协议。另一个容易混淆点是NSDictionary的key为什么要用copy修饰。正确原因是字典的key需要保证不可变如果外部传入一个NSMutableString作为key在存进字典后把原字符串改了就会导致哈希值变化之后用原来的key永远查不到值。用copy修饰后setter会把你传入的key拷贝一份不可变副本从源头避免这个问题。所以以后写代码定义NSDictionary属性时不要偷懒写strong写copy才是安全的。关于Foundation这块我还建议把NSArray的排序、过滤、遍历方式、NSString的截取与编码转换都过一遍。2019年的笔试里出现了好几个让你判断输出字符串长度的题目那些都是坑比如中英文混排、emoji和一个汉字占几个字符的问题。说实话不测试的话根本猜不对得多跑几行代码找感觉。3. 内存管理与Runtime笔试里最阴的一类题3.1 从MRC到ARC面试官换着法挖坑内存管理是iOS笔试里出题最频繁、也是我最容易翻车的部分。为什么会这样因为ARC已经帮我们管好了大部分内存平时IDE不会让我们手动release或retain很多人对引用计数的理解只停留在ARC会帮我处理这个层面一旦笔试把场景抽象出来就原形毕露。有一道题我记得特别清楚在ARC环境下以下关于dealloc的说法哪项是错误的A. dealloc方法里不调用[super dealloc]B. dealloc方法里可以访问实例变量C. dealloc方法里可以调用self的方法D. 在dealloc方法里释放系统资源这道题答案是A。ARC环境下不需要也不可以调用[super dealloc]编译器会自动插入。B、C、D都算合理但D要小心有时会出成在dealloc里访问对象的weak属性这个反而可能有隐患因为weak对象可能已经被销毁了。所以选择题里往往会把A和D都写得很有迷惑性你要能分辨出哪个是确定的错误。ARC下还有一个高频概念是weak和strong的底层差别。weak变量在对象销毁后会自动置为nil这个机制是通过runtime的weak表实现的。考题常常这样出下面哪个操作会让weak变量变成nilA. 对象调用releaseB. 对象被deallocC. 对对象执行copyD. 给对象发送autorelease答案B。对象开始销毁时runtime会清理weak表中的指针将其置为nil。这里要注意对象走dealloc不代表内存立即释放但它确实已经进入了销毁流程weak指针在这时候会先变成nil。这个细节就是选择题里看似对其实错的坑。autoreleasepool也是每年必出。考点集中在autorelease对象什么时候释放正确答案是在当前autoreleasepool作用域结束或者最内层runloop循环结束时释放。但选择题里常会出现出了作用域立刻释放这种错误选项。实际上如果你在一个局部autoreleasepool里创建了大量临时对象它们不会在每次循环迭代中立刻释放而是攒到pool drain时才释放想在循环中控制峰值内存要手动加autoreleasepool。3.2 Runtime题目的三种常见考法Runtime这块在客观题里通常不会考手写源码而是考三种固定套路消息转发流程、method swizzling、关联对象。先讲消息转发。题目一般给你一段代码问你调用一个不存在的方法会发生什么。很多人会直接说崩溃unrecognized selector。但Runtime的消息转发至少要经历三层机会动态方法解析resolveInstanceMethod、快速转发forwardingTargetForSelector、完整转发methodSignatureForSelector forwardInvocation。只有这三层全部没接住才会走进doesNotRecognizeSelector崩溃。选择题会问你下面哪个方法可以避免崩溃如果你不知道这些方法名就只能靠蒙。再讲method swizzling。这种题会问在load方法里对某个方法进行swizzle需要注意什么常见陷阱包括不能对一个已经被继承链中的子类复写过的方法做swizzle、要确保交换方法的实现时使用originalSelector和swizzledSelector对应的IMP都是有效的、在交换后如果调原方法会死循环。多年前有个很流行但错误的写法是直接在交换时调用原方法这会导致无限递归。正确的做法是在交换前用dispatch_once保证只执行一次并且把原实现保存为一个C函数指针而不是通过方法名再调一次。关联对象考的是objc_setAssociatedObject的存储对象属于谁。注意关联对象是存在一个全局的AssociationsManager里的并不是存在category或对象本身里。对象销毁后runtime会在dealloc时自动把关联对象清掉。所以如果题目问关联对象会自动释放吗答案是会它们在对象销毁时由runtime统一处理不需要手动remove。4. 多线程与网络客观题里性价比最高的模块4.1 GCD与NSOperation的选择题陷阱多线程是另一个容易送分也容易送命的模块。送分是因为核心概念不多送命是因为题里全是组合。最典型的一道题是这个dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(hello); });问这段代码在主线程执行会发生什么A. 正常执行B. 死锁C. 崩溃D. 无限循环答案是B。dispatch_sync向主队列提交一个block并同步等待但主线程此时正被dispatch_sync占着等待完成而block又要等主线程执行就形成了相互等待死锁。这个例子几乎在每套iOS笔试题里都会出现只是换层皮比如把dispatch_sync改成dispatch_async答案就变成正常执行因为它不等待。更进阶的考法是组合四个维度串行/并发队列 × 同步/异步执行。这里很多人容易搞混一个关键点同步执行不会开启新线程异步执行不一定会开启新线程在主队列里异步执行依然是在主线程执行的。选择题里经常出现凡是异步执行一定开辟新线程这种错误选项一定要警惕。我建议把这张四象限表格背下来队列类型同步执行异步执行串行队列在当前线程顺序执行不开启新线程按顺序执行可能开启新线程并发队列按顺序执行不开启新线程可同时开启多个线程执行主队列在已有主线程上执行容易死锁排在主线程runloop上执行不开启新线程还有一个高频考点是NSOperation和GCD的区别。选择题会问哪种说法正确。NSOperation是对GCD的封装支持取消、依赖、优先级、KVO而GCD更轻量。所以NSOperation比GCD更底层是错的GCD支持取消任务也是错的。遇到这种题你就抓住一个原则普通并发用GCD需要复杂任务编排用NSOperation。4.2 网络层这些细节不背真的会错网络题里TCP三次握手几乎是必考。问为什么是三次而不是两次标准答案是防止失效的连接请求突然又传到服务端导致服务端白白建立连接。选择题可能会换一种说法三次握手的第三次握手失败后服务端会怎样答案是服务端会启动超时重传机制如果没有收到客户端的ACK会重新发送SYNACK。这个细节很容易被忽略。HTTP和HTTPS的区别也是万年常青题。客观题会问HTTPS的加密流程考点是公钥加密、私钥解密、证书验证。经常有人把对称加密和非对称加密的先后顺序弄反。实际过程是先用非对称加密协商出一个对称密钥后续数据都用对称加密传输。所以选项里如果出现HTTPS全程使用非对称加密就是错的。URLSession在iOS开发里的作用也经常被用来出题。比如问默认情况下URLSession的任务在哪个线程回调答案是delegate queue指定如果没有指定会在一个串行操作队列上回调不是主线程。很多新手以为网络请求完成回调一定在主线程这不对。这是笔试里藏在UIKit和网络交界处的坑。再补充一个网络状态码的考点401是未授权403是禁止访问404是找不到500是服务器内部错误502是网关错误503是服务不可用。选择题会给你几个状态码让你选哪个表示服务器当前无法处理请求。这个虽然基础但混在一起真的容易迷糊。5. 从错题中总结出的选项排除法5.1 多选怎么选才不丢分多选是这套客观题里杀伤力最大的部分。因为360笔试的多选规则通常不是完全选对才给分而是漏选可以拿部分分错选就零分。所以一个非常实用的策略是除非你有90%以上把握否则宁可少选不要多选。说一个我踩过的例子。有一道题问以下哪些操作会造成循环引用选项里有一个是在block中使用self的strong引用变量另一个是在block中使用weakSelf。前者会造成后者不会。但真正让人犹豫的选项是第三个在block里访问self的实例变量。这个其实也会造成循环引用因为实例变量的本质是self-_ivar访问它会隐式捕获self。我当时因为不确定少选了它最后漏选扣了分。这类题就是考你对block捕获变量的理解细不细。多选时能排除两个错项剩下两个纠结选项如果关联太紧通常都是对命题人故意设计的组合你最好把知识链路完整想一遍再动手。多选题还有一个容易丢分的地方是全选的诱惑。有时候选项看起来都对但命题人会埋一个概念偷换。比如把KVO通过isa-swizzling实现换成KVO通过Runtime动态创建子类实现前者对后者也对但如果选项写成KVO通过修改原对象的子类方法列表实现那就错了因为它是动态创建新子类不是修改原类。遇到这种情况回到最原始的定义去看选项里有没有篡改类字眼。5.2 那些看似正确其实陷阱的表述客观题之所以难是因为很多选项在真实开发中好像没问题但在严格概念下就是错的。我总结了几个高频陷阱copy修饰属性时setter会执行深拷贝 —— 错。copy是对NSCopying协议的调用深拷贝还是浅拷贝由具体类的copyWithZone实现决定不直接等价于深拷贝。所有block在栈上需要copy到堆才能用 —— 错。在ARC下编译器大多数时候会自动处理但不是所有block都默认在栈上。delegate应该用strong引用 —— 错。delegate一般用weak是为了避免循环引用如果回答strong在很多场景会造成内存泄漏。ViewController的view在内存警告时会自动置空 —— 错。iOS6以后不再自动置空。ARC下不需要担心循环引用 —— 错。ARC只负责管理引用计数block的相互持有依然会导致内存泄漏。这类选项的共性就是说法太绝对或者把编译器的优化程度浪漫化。做题时看到一定、全部、总是这类词就要提高警惕先想想有没有反例。当然也不是所有绝对化表述都是错的比如weak变量在对象销毁后一定变成nil这在ARC中是成立的。所以关键还是靠知识储备来判断而不是靠语感。6. 备考与应试的几点实操建议6.1 我用过的刷题方法与资料范围如果你现在正在准备下一场iOS校招笔试我的建议是别只盯着原题。原题只能帮你熟悉出题风格但真正让知识不漏的是体系化复习。我当时主要做了三件事第一把Effective Objective-C 2.0这本书的白名单章节反复看了两遍。这本书几乎就是iOS客观题的题库来源尤其是关于属性修饰符、内存管理、block、GCD和Runtime的章节很多笔试选项都是从这本书里的观点改写的。第二在牛客网刷了近三年的iOS笔试题不光是360的其他大厂的也刷因为很多题目会互相借鉴。第三把每次错题所涉及的知识点写在索引卡上用Anki做记忆卡片每天过一遍。这个方法对记忆类考点特别有效比如状态码、拷贝语义、不同线程API的调用结果。还有一些容易被忽视的细节多看看官方文档里某个类方法在特殊情况下的表现比如NSMutableArray的copy返回什么类型、NSString的initWithFormat和stringWithFormat有什么区别。这些官方文档里写得很清楚但很少人会专门去查选择题反而最爱挑这种细节考。6.2 考场上的时间战术与心态调整再聊聊考场上的战术。第一遇到不会的单选题先排除1-2个确定错的选项然后凭第一印象选一个千万不要在上面停留超过2分钟。笔试时间很宝贵单选题的性价比最高你花费5分钟在一道单选上可能后面5道判断题都没时间做。第二多选题一开始就给自己设定一个心理边界拿不准的选项一律不选。因为漏选顶多少得分错选直接没分。第三判断题如果倒扣分也别太莽不确定的就先放着等做完其他题再回头判断。心态上有一点特别重要遇到一堆不会的题不要慌所有人都是这样的。360这种大厂笔试难度梯度设计得很明显前面有一批送分题中间有一批正常发挥题后面才放几道真正的压轴题。你要做的是把送分题全部拿稳正常题尽量拿压轴题通过分析和排除法也能抢几分。我当年那场笔试有两道多选是完全不确定的最后我就按少选、选自己最有把握的原则来处理结果出来居然没被扣太多分说明这个策略是有效的。最后再分享一个小经验复盘比刷题重要。笔试考完之后牛客网上一般能查到题解和大家的讨论这时候不管考好考坏都要回头把错题整理一遍。我每次都会把错题对应的知识点写进一个专门的文档里标注为什么错和正确思路。这样坚持一个月之后我做客观题的正确率明显提升因为很多题看似不同考点其实是同一个。这些东西没法靠临时抱佛脚只能靠平时的积累和反复咀嚼。希望这篇整理能帮你少踩几个坑多拿几分。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价