2023年我以应届生身份投了360的技术岗-iOS方向,笔试那关的客观题给我留下的印象特别深——看起来就是几十道选择题,但答起来总有一种"每一个选项都认识,凑一起就发懵"的感觉。后来我把备考时搜到的经验、面经帖、社区讨论和自己踩的坑放到一起复盘,才发现这类客观题考的根本不是记忆,而是你对iOS这套技术体系有没有建立完整的理解链条。这篇文章就围绕360校招技术岗客观题(iOS方向)展开,从出题逻辑、考点分布、典型题目拆解到考场策略,给后面要参加类似笔试的同学一个系统的参考。
1. 笔试第一关的出题逻辑:客观题到底想卡掉什么人
先说一个很多人容易忽略的前提:校招笔试的客观题和平时刷的LeetCode、牛客题单不是同一种东西。LeetCode考的是算法思维,而技术岗客观题考的是"你是不是真的写过iOS代码、读过源码、踩过坑"。360这类公司把客观题放在简历筛选之后,它的目标不是选最优,而是用最低的筛选成本把基本功不扎实的人卡在面试之前。
1.1 岗位画像决定考点边界
iOS技术岗客观题的内容边界,基本由岗位画像决定。应届生的iOS岗位要求通常写的是"熟悉Objective-C或Swift、掌握UIKit、了解内存管理、多线程、网络、熟悉常用第三方库的使用"。这句话看起来宽泛,但落到笔试上就有据可循了。
你可以把考点想象成一张树状图:根节点是OC语言和Swift语言特性,第一层分支是内存管理和引用计数,第二层是RunLoop线程模型和GCD,再往下是UIView和CALayer的渲染层级、事件响应链、网络库封装、数据持久化方案。360的客观题很少考特别生僻的API,反而喜欢在"大家都以为我懂"的地方下刀。什么叫"以为我懂"?比如ARC模式下编译器到底帮你插了什么代码、weak表在什么时机被清理、runtime的消息转发到底分几步——这些概念平时开发时天天在用,但真到选项里给你几种表述,就容易卡壳。
所以备考的第一步不是去翻最新的SwiftUI文档,而是先把iOS的基础链路自己画一遍:一个App从启动到main函数到RootViewController,一个UIButton从点击到事件分发到响应链,一个网络请求从发起到了NSURLSession回调到数据解析。每一条链路中的关键节点,都是客观题的出题候选位置。
1.2 客观题的难度分层:送分题、中档题和压轴题
以2023年的情况看,iOS方向的客观题大概在40到50道之间,时间限制通常在60到90分钟。题量不算大,但对每个题需要花的时间差异很大,做题节奏非常关键。
简单分类的话,大概可以分成三层:
- 送分题(约30%):考API名称、基础概念、系统框架归属。比如"以下哪个类属于UIKit""UIScrollView的代理方法里哪个在拖动结束时调用"。这类题只要系统学过iOS开发基本拿得下,选项之间也没有太多迷惑性。
- 中档题(约50%):考原理和执行结果。比如给一段代码问输出顺序、问某个状态下内存有没有泄漏、问某个操作在主线程执行会发生什么。这种题坑最多,因为代码运行环境、生命周期、队列类型都可能影响答案。
- 压轴题(约20%):考的是工程经验和跨知识点的综合判断。比如给你一个复杂的App启动场景,问在哪个阶段做某件事最合适;或者给一个多线程同步问题,问哪种写法不会死锁。这类题已经没有标准教材的现成答案了,必须在实操中踩过坑才能选对。
我对这套分层最大的感受是:送分题保证你及格,中档题决定你能否进入下一轮,压轴题才是区分度所在。很多人复习时把时间花在啃冷门API上,其实方向反了。中档题和压轴题背后考的是知识体系,它们才是笔试的决胜点。
1.3 客观题是及格线测试,不是竞赛测试
还有一点必须想清楚:即使你只拿了60%的正确率,也不一定被刷,关键在于你做错的是哪些题。公司更看重的是核心知识的掌握度,而不是绝对的分数排名。如果基础送分题全对,中档题错一半,压轴题基本蒙,只要核心链路知识过关,仍然有很大概率进面试。
反过来,如果把送分题做错几道,即使压轴题全对,面试官也会怀疑你的基础是否扎实。所以备考和答题都讲究"确保核心不丢分,再尝试拔高"。这是我当初复习时的一位学长反复强调的观点,实际考完也验证了这一点。
2. 从社区热词反推iOS客观题最爱考的五个方向
做技术岗笔试有一个取巧但有效的分析思路:看这个岗位上的人在社区里最常讨论什么问题。面试题不会凭空出现,它往往来源于开发者在日常工作里反复撞到的话题。我整理了一下iOS技术岗相关的高频讨论话题,把它们对应回到笔试考点上,大致可以归纳成五个方向。
2.1 底层原理类:内存管理、RunLoop与消息传递
这一块在社区热搜里对应的词是"ios开发""ios架构""ios面试题"。内存管理是iOS笔试的重灾区。它不直接问"ARC是什么",而是给你一段代码问后果。比如strong和copy的区别、weak在什么情况下会被置空、@autoreleasepool对循环内存峰值的影响、Block对变量的捕获方式。
RunLoop同样是高频考点。它和Timer、滑动卡顿、界面刷新都有关系,笔试时最常见的出题形式是:主线程的Timer在UIScrollView拖动时为什么暂停?答案就是RunLoop在切换Mode。这个知识点如果不理解Mode机制,单纯背概念很难做对。
消息传递则是iOS和Java、C++面试差异最大的地方。runtime的方法查找、缓存、消息转发,笔试直接给方法列表问调用顺序是很常见的考法。我之前遇到过一道多选,让你从几个方法里挑出消息转发的正确顺序,选项里混杂了resolveInstanceMethod、forwardingTargetForSelector、forwardInvocation、methodSignatureForSelector。如果只是写过OC但没看过runtime源码,很容易被顺序绕晕。
2.2 UI与布局类:AutoLayout、UIStackView与渲染机制
"ios oc uistackview""ios分屏""ios架构"这几个热搜词指向的是UI考察方向。iOS客观题里UI部分从来不考"如何在Xcode里拖一个控件",而是考你对布局和渲染的理解。
UIStackView在iOS 11之后的适配问题考过多次,因为旧项目里仍有很多用Frame布局的地方,什么时候选择StackView、约束优先级和固有内容大小是笔试切入点。AutoLayout相关题目也很典型:两个等宽Label中间有8pt间距,如何用约束表达;当约束冲突时,哪个约束会被打破。这类题考察的是你是否真地理解和调试过约束,而不只是会在storyboard里点几下。
UIView和CALayer的关系也是经典。单选常问"以下关于UIView和CALayer的描述,哪项是错误的",干扰项包括"UIView是CALayer的代理""CALayer负责内容绘制""UIView继承自CALayer""一个UIView对应一个CALayer"。答案是"UIView继承自CALayer"——它俩没有继承关系,UIView是NSObject的子类。这种题不难,但很考验对渲染层级的理解是否清晰。
2.3 多线程与并发类:GCD、Operation与锁
多线程是校招笔试的必考板块,对应热搜词里的"ios自动化""ios开发 电池优化"。GCD相关题目几乎每年都会出现。
最经典的莫过于"在主队列上调用dispatch_sync会发生什么"。很多同学知道结果叫"死锁",但不知道为什么死锁,以及死锁和崩溃的区别是什么。主队列是串行队列,当前正在执行的任务被同步追加的任务阻塞,而追加的任务又在等待当前任务结束。两者互相等待,最终卡死。如果选项里出现"程序直接崩溃",那就是故意设置的干扰项——死锁不会立即崩溃,而是界面永久卡住。
除了GCD,NSOperation和NSOperationQueue也常考,比如"以下哪个操作可以取消已经加入队列的Block"这类问题,考察Operation相对GCD的可取消、可依赖特性。锁方面,@synchronized、NSLock、dispatch_semaphore、os_unfair_lock的区别也偶尔出现,一般以判断死锁场景的形式出现。
2.4 网络与数据持久化类
这个方向对应热搜词里的"charles ios抓包""ios上架""ios开发者模式"。网络部分的客观题集中在HTTPS握手机制、DNS解析顺序、NSURLSession的请求流程、POST和GET的底层差异。有一道我印象很深:客户端发起HTTPS请求后,校验证书时如果证书无效,系统会给出什么结果。备选答案里有"直接拒绝连接""继续请求但不加密""弹窗提示用户风险""静默降级为HTTP"。正确选项是"直接拒绝连接"。因为AFNetworking和NSURLSession在证书校验失败时都会直接抛错,只是很多同学实际开发时没遇过,就凭感觉选了。
数据持久化部分则偏爱考SQLite和Core Data的边界。Core Data是不是数据库?不是,它是一套对象图管理框架,底层可以基于SQLite存储。这是典型的概念辨析题。
2.5 工程化与上架分发类:证书、签名、打包与自动化
这块在热搜里的对应关系最明显:"ios开发者app证书更新""ios上架""uniapp打包ios流程""ios开发者模式"。
很多人以为应届生笔试不会考工程化知识,但近几年这类题的比例明显上升。原因很现实:公司希望招进来的人不用从零教打包和上架流程。常见考点包括:开发者证书和描述文件(Provisioning Profile)的作用、App ID和Bundle Identifier的匹配规则、签名机制为什么能防止App被篡改、TestFlight和App Store审核的区别、加急审核申请的条件。有一道题问"iOS应用在真机调试时需要配置什么",选项覆盖了开发者证书、描述文件、打包脚本、服务器证书。正确答案是开发者证书和描述文件,因为真机安装的前提就是签名。这类题不写代码,但如果你真地走过一次上架流程,闭着眼都能选对。
工程化里还有一个高频方向是自动化,比如Xcode Server、fastlane、Jenkins在iOS项目中的用途。选择题的常见问法是"以下哪个工具可以实现iOS持续集成",fastlane就是常设置的正确答案之一。
3. 六道现场型客观题拆解,看看正确思路是什么
为了保证实用性,我根据上面总结的高频考点,整理了几道很有代表性的模拟题。这些题目的结构和出题思路与2023届360校招技术岗客观题iOS方向的风格很接近,拿来做考前练习和思路训练挺合适。
3.1 题目一:ARC下copy修饰符的隐藏陷阱
@property (nonatomic, copy) NSMutableArray *dataArray; NSMutableArray *temp = [NSMutableArray array]; self.dataArray = temp; [temp addObject:@"1"]; // 此时self.dataArray的count是多少?这道题问的是self.dataArray这个数组在后续操作中会不会受temp影响。copy修饰符会在赋值时执行一次拷贝,对可变对象做copy得到的是不可变对象,所以self.dataArray和temp已经完全是两个对象了。temp继续addObject,self.dataArray这边不会有任何变化,count仍然是0。
考点有两个:一是copy和strong的区别,二是可变对象的copy默认是深拷贝还是浅拷贝。在集合类场景下,对NSMutableArray做copy得到的不可变拷贝,其实元素指针是浅拷贝,但容器本身是新的。很多同学背过"copy是拷贝、strong是强引用",却没有深究copy对可变和不可变对象的行为差异,这类题正好打在记忆盲区上。
如果笔试时题目把copy换成strong,答案就反过来了:temp的addObject会直接反映到self.dataArray上,因为它们指向同一个对象。所以做这类题时,先看清楚修饰符,再看清楚对象的可变性,两个条件缺一不可。
3.2 题目二:主队列上的dispatch_sync
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"执行"); }); }这道题的输出是什么?选项一般给四种:打印"执行"、崩溃、死锁、编译报错。正确答案是死锁。viewDidLoad本身已经运行在主队列中,你在当前任务还没执行完的时候,向主队列同步派发一个新任务,这个新任务要等当前任务结束才有机会执行,而当前任务又在等新任务执行完毕,形成互相等待。
理解了原理之后你会发现,这个知识点还能延伸出很多变体。比如把dispatch_sync换成dispatch_async,题目就从"死锁"变成"会正常执行"。把主队列换成全局并发队列,也不会死锁,因为全局并发队列不需要等待当前任务结束就能开启新线程执行。很多同学只背"主队列+同步=死锁"的结论,遇到变体题就蒙了。建议复习时把串行并发、同步异步两两组合的四种情况都画一遍,笔试时不管怎么出都不会慌。
3.3 题目三:RunLoop Mode影响NSTimer
先在主线程创建一个Timer并加到DefaultMode,然后用户拖动UIScrollView,问Timer的状态。答案是Timer暂停触发,等拖动结束又恢复。
这个现象背后的原理是RunLoop在同一时刻只能运行在一个Mode下。平时主线程RunLoop运行在DefaultMode,拖动UIScrollView时系统主动切换到TrackingMode,而Timer被加在DefaultMode里,TrackingMode可不管它。解决方法是把Timer加到NSRunLoopCommonModes,让它在多个Mode下都能跑。
笔试有时候会在这个题上多挖一层,比如问你"把Timer加到CommonModes后,Timer为什么能在TrackingMode下触发",这就涉及到CommonModes是对一组Mode的抽象标记,Timer加入后等于同时注册到了Default和Tracking两个Mode上。
这个知识点在Swift里同样成立,只是API从NSRunLoop换成了RunLoop。所以无论题目是用OC还是Swift写,底层逻辑是同一套。
3.4 题目四:UIView与CALayer的关系辨析
同样地,经典多选:"下列说法正确的是"。选项常见的有:
- UIView是NSObject的子类
- CALayer继承自UIView
- UIView的frame是layer.frame的映射
- UIView负责事件响应,CALayer负责内容展示
正确答案是1、3、4。2是明显的错误项。只要理解UIView和CALayer是"组合"关系而不是"继承"关系,这题就送分。UIView持有一个CALayer,负责的事件响应和视图层级管理,而图层内容的绘制渲染则主要由CALayer完成。
题目还会延伸问:transform是作用于UIView还是layer?在iOS开发中,UIView的transform属性其实就是对layer.transform的封装。记住一条主线就行:凡是和界面展示、图层运动有关的最终都落到CALayer,凡是和交互、事件有关的都归UIView管。
3.5 题目五:分类中@property的局限
在Category中声明@property,能否自动生成对应的成员变量和setter/getter方法?这是OC语言部分很常见的提问。正确答案是不能。
分类在运行时只是把方法列表附加到类对象上,它没有办法添加新的实例变量,因为实例变量的内存布局在类对象编译完成时已经确定了。所以在分类里写@property,编译器只会生成setter和getter的声明,不会自动生成实现。如果直接调用,会得到一个unrecognized selector崩溃。实际开发中想给分类加属性,必须用关联对象,也就是objc_setAssociatedObject和objc_getAssociatedObject。
这一题考的是OC的对象模型。如果面试官想往深问,还会追问关联对象怎么管理生命周期、什么时候释放。关联对象的释放时机其实是对象dealloc的时候,系统统一做清理。这个细节在笔试的多选里也可能出现,选项会说"关联对象在dealloc时自动释放",这个是对的。
3.6 题目六:运行时消息转发的正确顺序
这题一般是多选或排序题。对象收到一个无法处理的消息后,运行时会依次调用以下方法:
- +resolveInstanceMethod:(类方法级别决定动态添加方法)
- -forwardingTargetForSelector:(快速转发给另一个对象)
- -methodSignatureForSelector:和-forwardInvocation:(完整消息转发)
- -doesNotRecognizeSelector:(最终抛出异常)
我遇到过一道排序题,选项里故意把methodSignatureForSelector和forwardInvocation的顺序打乱。实际上methodSignatureForSelector必须在前,因为forwardInvocation的NSInvocation对象需要依赖方法签名来创建。这两者是一个绑定关系,光记名字不够,得理解它们为什么按这个顺序执行。这个知识链如果理清了,不但笔试能拿分,之后看AOP、防崩溃库的源码也会轻松很多。
3.7 这些题暴露出的共同问题
六道模拟题做下来,你会发现它们的失分点高度相似:不是你不知道这个知识点,而是你在两个相似概念之间做了错误的等价替换。copy和strong不相等、同步和串行是两回事、UIView和CALayer不是继承、分类的property不自动生成实现。客观题就在这些"看似相同实则不同"的位置设坑。
所以复习时建议做一个专门的对比表,把每对高频易混概念整理成两列,左边是概念A,右边是概念B,中间写明它们在什么场景下相同、什么场景下不同。这种整理方式比重复刷十遍题更有效。
4. 考场上的时间分配和四步答题法
笔试复习到位只是第一步,考场上的节奏管理同样重要。技术岗客观题的坑在于,前面的题往往比较简单,这时候容易松懈;做到后面突然遇到一道多选,反复琢磨后时间就失控了。我总结了一套比较实用的答题节奏,分享给大家。
4.1 按题型控制节奏
客观题一般分单选和多选。我的建议是:单选题控制在每题1分钟左右,多选题控制在每题1.5分钟左右。如果一道单选超过2分钟还没把握,先标记跳过,把后面会的题全做完再回头处理。多选如果有选项拿不准,不要为了"完整"硬选,少选比错选更稳。因为很多笔试的多选计分规则是"选错零分,少选得部分分",宁缺毋滥是最高性价比策略。
拿到试卷后先用30秒扫一遍所有题目,把明显会做的、需要思考的、完全不会的分别标记出来,然后再开始按顺序做。这个动作虽然简单,但能让你对全局题量有数,后面做起来心理压力小很多。
4.2 四步答题法:读题、定位考点、排除、确认
面对每一道题,我习惯用固定的四步流程:
第一步读题,重点看"下列说法正确的是"还是"错误的是",以及代码里的修饰符、队列类型这些关键限定词。 第二步定位考点,问自己这道题在考什么,是内存管理、RunLoop、runtime还是AutoLayout。 第三步排除,先排除明显错误的选项,把选项数量缩小到两个。 第四步确认,对剩下的选项做最后甄别,尤其检查有没有"绝对化"表述,比如"一定会""绝对不会""所有情况"这类词,它们往往是错误选项的高发特征。
这套流程看着简单,但在考场高压下能有效避免"凭感觉选"。尤其是"定位考点"这一步,它能把一道陌生题目迅速映射到你熟悉的复习模块里。比如看到代码里出现dispatch_sync,就自动进入"队列类型+同步/异步+是否当前队列"的检查清单,判断路径清晰不少。
4.3 不确定的题目处理方式
前面说到标记跳过,但"跳过"不等于"放弃"。建议所有题目都先选一个第一直觉的答案并做标记,等后面时间充裕再回头改。因为根据统计,第一直觉的正确率通常高于纠结很久后修改的答案。你可以在做完所有题后,只处理那些"一眼就知道没把握"的题目,其余保持初始判断。
对于完全不会的知识点,也不要留空白。利用对选项的分析,排除掉一两个明显不对的,从剩下选项里猜一个。特别是iOS方向的题目,很多干扰项的逻辑是"把不同框架的API混在一起",比如把CoreData的东西放到UIKit的描述里,只要你对框架边界稍有概念,就能提高不少蒙对概率。
4.4 多选的取舍法则
多选题是拉开分数的地方,也是最容易让人心态崩溃的地方。我的原则是"只选有把握的"。如果一道多选题你能确定两个选项一定对,第三个选项只有60%的把握,那就只选这两个。少选最多丢一部分分,错选直接整题零分,这个账很容易算。
特别注意"包含关系"选项。有些多选会把一个概念拆成两个表述,一个宏观一个微观,这两个选项通常可以同时成立。也有些选项看起来正确,但描述范围超出了实际含义,比如"RunLoop可以保证线程安全"这种大概率是错误项,因为RunLoop只是一套事件循环机制,跟线程安全没有必然关系。
5. 笔试结束后如何把客观题的价值二次利用
很多人笔试结束就松一口气,把题目抛在脑后。实际上,客观题是一次极精准的知识体检报告,你能从错题里看出自己知识体系的缺口在哪里。而这些缺口,大概率就是后续面试中面试官追问的突破口。
5.1 错题知识点映射面试深挖点
我建议笔试结束后立刻做两件事:第一,尽可能地回忆和记录题目。哪怕记不全,把考点关键词写下来也好。第二,对每个错题标注"是知识盲区还是粗心错误"。知识盲区意味着需要补课,粗心错误意味着对某些概念的敏感度不够。这两类问题的处理方式完全不同。
比如如果你错在copy修饰符那道题,那么面试时面试官很可能会追问:copy一个自定义对象的时候,如果要实现深拷贝,需要重写什么方法?这就引到了NSCopying协议、copyWithZone:方法。如果你还能答出"自定义对象里含有可变集合属性,深拷贝时需要递归处理子对象",面试官会明显觉得你有深度。也就是说,笔试错题是天然的面试预测题源。
5.2 延伸学习清单:把考点从选择题升级为简答题
接着上面说,每道笔试客观题背后都挂着一串简答题。我给每个核心考点列一个延伸清单:
- 内存管理:ARC和MRC的区别、weak的实现原理、autoreleasepool什么时候生效、循环引用的常见场景及检测方法。
- RunLoop:RunLoop的几种Mode、Source/Timer/Observer三类事件源、RunLoop在AFNetworking或SDWebImage中的应用。
- runtime:方法查找流程、isa指针结构、Method Swizzling的风险和安全写法、动态添加方法的作用场景。
- 多线程:并发队列和串行队列底层的线程创建机制、线程安全的几种同步方式、线程死锁排查工具。
- 网络:HTTPS握手全流程、Charles抓HTTPS的原理、证书双向校验的配置方法、DNS解析和HTTPDNS的对比。
- 工程化:App签名和描述文件的关系、上架审核被拒的常见原因、fastlane自动打包流程、Build号和Version号的区别。
把这些清单掌握了,不但面试稳,实际工作也会顺利很多。我发现很多同学为了笔试临时背了一堆概念,笔试一结束就忘得干干净净,等到实习入职后发现连真机调试都配置得费劲。其实笔试内容就是开发基本功,眼光放长远点,把每道题当成一次提升自己的机会,心态会完全不一样。
5.3 横向对比:同场笔试中的Android与跨端考题趋势
360技术岗的笔试会把iOS、Android、跨端方向放在同一场,各方向独立出题但整体流程一致。最近几年有个趋势是"方向壁垒正在变薄",iOS的客观题偶尔也会掺一点跨端知识,比如uni-app打包iOS的流程、或者HarmonyOS的ArkTS特性和OC的异同。这类题目占比不高,但能看出公司对技术栈广度的期待。
我的建议是备考iOS方向的同学至少了解一个跨端框架的基本原理,比如uni-app或Flutter为什么能一套代码多端运行,它们在iOS上最终渲染的视图层级和原生UIKit有什么关系。不用深入源码,理解到"跨端框架最终会桥接到原生控件或自绘渲染"这个程度就够用了。因为这类题在客观题里只考概念层面的判断,不会让你去写Flutter插件。
另一个值得留意的趋势是对"自动化与性能优化"的考察变多了。ios开发 电池优化、ios自动化这些社区高频词对应到笔试里,就是关于性能调优和持续集成的选择题。所以复习时不要只盯着语言特性,把每个框架的职责边界和选型理由想清楚,比起背具体API能应对更多类型的题目。
说到底,技术岗笔试是一场面向基本功的高压体检。它把iOS开发零散的知识点打散成一道道客观题,看起来考的是一个个孤立的选项,实际上考的是你有没有形成系统的知识网络。2023年这一轮备考让我最深刻的体会是:不要为了笔试去"背题",而是把笔试当成梳理知识体系的机会。知识网络一旦建立起来,后续的面试问答和实际开发都会顺畅得多。如果时间有限,优先吃透内存管理、RunLoop、多线程、UI布局和runtime这五个方向,然后认真做完几套模拟题,最后复盘错题对应到面试追问清单。按照这个路径走下来,跨过笔试这关是大概率事件。