news 2026/9/6 1:40:54

360校招iOS开发笔试客观题解析:内存管理、Runtime与多线程考点全拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
360校招iOS开发笔试客观题解析:内存管理、Runtime与多线程考点全拆解

每年秋招季,总有大量准备投递iOS开发岗位的同学在刷笔试题。360公司2019校招笔试中的iOS开发工程师客观题合集,是网上流传比较广的一套材料,不少人把它当作练习题库。我当年也刷过这套题,后来带团队那几年,又拿它给新人做过摸底测试。这份客观题合集覆盖了OC语言基础、内存管理、Runtime、多线程、RunLoop、UIKit等核心方向,题型以单选、多选和判断为主,难度整体偏基础,但陷阱不少,很能反映一个候选人平时的积累是否扎实。这篇文章我会把整套题目的考察点、典型真题和解题思路整理出来,给正在准备校招、或者想系统自查iOS基础的同学做参考。

1. 校招笔试的题型构成与客观题定位

1.1 360校招笔试的试卷结构与考察逻辑

先说说这份笔试合集的大致构成。360的校招笔试分成两大部分:一部分是行测类题目,用来筛逻辑和阅读理解;另一部分是专业题目,也就是iOS开发相关的客观题和主观题。客观题在专业部分占了很大比重,题型以单选、多选和判断为主,偶尔会穿插几道填空题。题量大概在50到70道之间,答题时间很紧,平均一道题只有一两分钟,所以做题速度和对基础知识的熟悉程度,直接决定最终成绩。

从考察逻辑上看,这套客观题并不是为了考倒你,而是为了快速筛出基础扎实的候选人。题目大多来自几个固定知识域:Objective-C语言特性、内存管理与引用计数、Runtime消息机制、多线程与并发、RunLoop运行循环、UIKit布局与事件传递、网络请求与数据解析,还有少量数据结构与算法穿插其中。你会发现它有意避开了那些需要大量实际项目经验的深水区问题,比如大型项目的模块化设计、复杂性能优化案例分析等,因为这类内容更适合放在面试环节里聊。客观题承担的任务,是在最短时间里验证一个人是不是真正理解iOS开发的核心机制。

1.2 客观题的特点与备考侧重点

客观题看起来简单,实际上丢分点非常多。第一个特点是“多见多选”:很多题目给出四个选项,其中两到三个是对的,选错一个整道题就没分,这对知识点的准确性要求很高。第二个特点是“概念细节考察”:比如会问你strong和copy修饰NSMutableString有什么区别,或者delegate和notification在什么场景下会导致循环引用。这些细节平时用的时候可能不会多想,但笔试就是专门挑这些地方。

所以备考这套客观题,我的建议是不要盲目刷题,而是先搭好知识框架。把iOS开发的基础概念按“语言基础、内存管理、运行时机制、并发编程、UI系统、网络”几个模块分开过一遍,每个模块配合10到20道练习题。刷题的本质目的是暴露知识盲区,而不是背答案。如果你能做到看到一道题就能说出它考察哪个知识点、干扰项错在哪里,那笔试基本就不会被客观题卡住。

2. 内存管理与属性修饰符:必考的硬骨头

2.1 属性修饰符的交叉考点

这套客观题里,属性修饰符相关题目出现频率非常高,几乎每次出一组多选,而且正确率普遍偏低。核心考点是strong、weak、copy、assign、retain、unsafe_unretained这些修饰符的语义差异,以及它们在不同对象类型上的适用场景。

我说几个最典型的考察角度。第一个是copy和strong的区别:对于NSString类型的属性,用copy修饰可以防止外部传入NSMutableString后,外部再修改字符串导致属性值也变化。但如果属性本身声明为NSMutableString类型却用了copy,运行时赋值会得到一个不可变副本,之后调用appendString等可变方法就会直接崩溃。第二个是weak和assign的区别:两者都不会增加引用计数,但weak在对象释放后会自动置为nil,assign则不会,所以assign修饰对象类型会产生悬垂指针。第三个是block属性为什么要用copy:在MRC时代,block可能存放在栈上,离开作用域后就会被回收,必须复制到堆上才能安全持有;虽然在ARC下编译器会自动处理一部分,但用copy修饰依然是信号明确、安全性更高的写法。

注意:不要因为ARC下编译器做了优化,就认为属性修饰符可以随便写。copy和strong在语义上仍有本质区别,这不仅是笔试考点,更是线上事故的常见源头。

2.2 经典内存管理客观题与解析

我再举一道很有代表性的题目:给你一个对象A,内部持有一个block,block内部引用了A的一个属性,问在ARC环境下是否存在循环引用,如何解决。答案是存在循环引用,解决方案是把self弱化为weakSelf,在block内部再用strongSelf承接。这题难的不是答案本身,而是它考察你是否理解“对象持有block,block又捕获self”这条引用链。

另一类高频题目是MRC和ARC的对比,比如询问autorelease对象在什么时机释放。正确的理解是:autorelease对象在所在的autoreleasepool drain时释放,而不是函数结束立即释放。很多人在这里选了“函数返回时释放”这个错误选项,就是因为对运行循环和自动释放池的协作机制理解不到位。类似题目还有“dealloc里应该做什么”,核心答法是:释放非ARC对象、移除通知观察者、停止定时器,但不要在里面访问self的属性,因为此时对象正在销毁过程中,属性访问可能触发不可预期的问题。

2.3 循环引用的日常场景与排查手段

循环引用这个知识点,客观题里反复出现,实际开发中也最容易出问题。除了block之外,NSTimer和CADisplayLink也是重灾区:定时器被控制器强持有,定时器的target又指向控制器,如果不做处理,控制器永远无法释放。所以较新的iOS版本里,系统提供了带block回调的timer接口,用weakSelf承接后可以规避,但仍需在合适时机手动invalidate。

此外,delegate声明为strong、block作为属性被对象A持有且内部引用A、父子控制器相互持有等,都是客观题喜欢列出来的错误示例。排查这类问题,常规手段是看dealloc有没有打印,再用Xcode的Memory Graph工具检查对象引用链。笔试里遇到循环引用题,我的判断方法是:先在草稿上画出谁指向谁,只要看到一条完整的引用环,就说明存在循环引用。

3. Runtime、多线程与网络层:客观题里的高阶考点

3.1 Runtime机制常考方向与易错点

Runtime这块,客观题很少考到特别深的实现细节,更多是考察消息发送、方法交换、动态添加方法这些基础概念。比如给你一个类,父类和子类都实现了同一个方法,问调用时消息查找的顺序:先从对象的isa指针找到类对象,再到类对象的方法缓存和方法列表中查找,找不到再去父类查找,最终到NSObject,如果还找不到就会进入消息转发流程。选项里经常混入“先去父类查再查自己”这种错误顺序,很多人凭感觉就选了。

方法交换也是常见考点,特别是class_getInstanceMethod和method_exchangeImplementations的搭配使用。这里有个细节常被忽略:交换之后,原本的IMP和新的IMP互相调换,再调用原方法时实际执行的是替换后的代码,所以一般在load方法里做交换,并且要注意被交换方法在父类中的继承关系。客观题里如果问“交换后是否会影响到父类实现”,很多人会答错,实际要看method列表是继承的还是本类重新生成的。

3.2 多线程与并发控制的客观题陷阱

多线程题目在这套客观题里出现率很高,核心考点包括:GCD的队列类型、同步异步与死锁、NSOperationQueue的依赖关系、线程锁的区别。最常见的一道题是:在主队列上调用dispatch_sync会有什么结果。答案是死锁,因为主队列是串行队列,同步任务在队列中等待执行,而正在执行的代码也在同一个队列里等它结束,互相等待就卡住了。这个例子非常经典,几乎年年都有。

注意:遇到“主队列 + dispatch_sync”类题目,不要犹豫,直接判定为死锁。这个组合是笔试客观题里的常客,也是实际开发中新手最容易踩的坑。

另一道高频题是:串行队列和并发队列里执行同步/异步任务,会开启几个线程。很多人误以为异步一定会开新线程,其实异步只是把任务提交后立即返回,如果提交到串行队列,任务还是在同一个线程上串行执行;并发队列异步执行时才会根据系统负载创建多个线程。同理,dispatch_barrier_async的作用是在并发队列中插入一个隔离任务,确保它之前的任务都完成后才执行,它之后的等等它完成。笔试里常问barrier和普通的sync有什么区别,核心回答是:barrier不会被其他并发任务插队。

3.3 网络请求与数据解析的考点覆盖

网络层面的客观题,考察最多的不是具体API,而是基础的网络协议和请求流程。比如HTTP和HTTPS的区别、TCP三次握手的作用、JSON序列化时常见的数据类型问题。一道看起来很不起眼的题目是:为什么TCP连接需要三次握手而不是两次。原因是三次握手能确认双方的收发能力都正常,同时防止已失效的连接请求突然到达服务端,导致资源浪费。这种题看着和iOS无关,但实际上iOS开发天天依赖网络请求,笔试考它是在考察工程师的基本功。

在iOS框架层面,常考的有:NSURLSession的delegate回调在哪个线程执行、如何处理cookie、ATS(App Transport Security)对HTTP明文请求的限制如何配置。此外还会涉及JSON和模型转换,比如问JSON中某个字段类型与模型属性不匹配时会发生什么,最稳妥的做法是用类型安全的映射框架,并且在解析前做类型校验。

4. 高频客观题合集:典型题目与逐题拆解

4.1 OC语言基础类题目示例

这一节我把这套客观题里典型的真题形式整理出来,按知识点分类,每一类配上一道有代表性的题目和解析,方便直接对照练习。

【单选题】下面代码输出什么:

NSString *str = @"Hello"; NSString *str2 = [str copy]; NSMutableString *mStr = [str mutableCopy]; NSLog(@"%d %d", str == str2, str == mStr);

A. 1 0 B. 0 1 C. 1 1 D. 0 0

正确答案是A。不可变字符串的copy在ARC下一般会直接返回原对象,所以str和str2是同一个指针;mutableCopy一定会生成新的可变对象,指针不同。这题考察的是copy和mutableCopy的语义区别,也是面试现场经常手写的一个点。

4.2 UIKit与界面布局类题目

UIKit方向的客观题,主要集中在事件传递、视图生命周期和布局原理三个方向。事件传递是一个特别容易出多选题的点,比如点击一个子视图,系统如何找到响应者:先通过hitTest:withEvent:从父视图往子视图遍历,找到最合适的视图后,再沿着响应链从子视图向父视图传递,直到有视图处理该事件。这里经常出现的错误选项是“事件从子视图向父视图查找”,这个说法混淆了触摸命中测试和响应链两个阶段。

布局方面,frame和bounds的区别也是必考。frame是相对于父视图坐标系的尺寸和位置,bounds是相对于自身坐标系的尺寸,默认起点是(0,0),“修改bounds的origin会让子视图移动”这个说法很多人不理解,实际在scrollView中很常见。Autolayout的必考点是content compression resistance和content hugging priority,简单理解就是一个视图“不愿意被压缩”和“不愿意被拉伸”的程度,优先级高的在约束冲突时获得主导权。

4.3 架构模式与系统框架类题目

架构模式的客观题,一般不会让你设计一个完整架构,而是考察几个基础概念:MVC和MVVM的核心区别、Delegate和Notification的使用场景、单例模式的优缺点。常见的一个多选题:在什么情况下应该选择Notification而不是Delegate。正确答案包括:一对多通信、解耦两个无关模块、跨层级事件传递。而容易混淆的选项是“需要返回值”或“严格一对一回调”,这些应该优先考虑Delegate或Block。

系统框架层面的题目,还会涉及App的生命周期、启动流程、沙盒目录结构等。比如问从点击图标到didFinishLaunching之间发生了什么,核心是系统加载mach-O文件、创建进程、初始化runtime、调用main函数、建立主事件循环,最后调用AppDelegate回调。沙盒目录的题目则喜欢考Documents、Library、tmp三个目录的用途以及哪些内容会被iCloud自动备份。

5. 客观题备考的常见误区与实操建议

5.1 常见失分原因分析

我从周围同学和团队新人的反馈里,总结出这套客观题最典型的四类失分原因。第一种是“选项陷阱看不出来”:很多题目的正确选项长得很像,只差一个限定词,比如“dispatch_async一定会开新线程”和“dispatch_async到并发队列时可能开新线程”,一字之差,一个是错的,一个是对的。第二种是“基础概念记忆模糊”:比如Category能否添加属性、能否添加实例变量,很多人做题时犹豫,实际上Category可以添加属性声明,但不会自动生成实例变量和getter/setter,除非用关联对象实现。

第三种是“不理解原理只背结论”:例如背过“weak不会增加引用计数”,但遇到“weak对象访问是否线程安全”这类变体题就答不上来。第四种是“时间分配不合理”:客观题一道题卡太久,导致后面的主观题或代码题没时间写。我的建议是控制单题时间在90秒以内,拿不准的先标记,最后再回头处理。

5.2 刷题之外的准备:一份可复用的复习路线

如果只靠刷这套客观题,覆盖面是不够的。我的建议是把它当作查漏补缺的清单,而不是唯一复习材料。具体可以按这个顺序过一遍:先拿下OC语言基础,重点学习属性、block、内存管理;再攻Runtime和RunLoop,这部分推荐用官方文档加源码解读的方式理解;然后是多线程,把GCD、NSOperation和锁的API都写一遍Demo;接着是UIKit,从事件传递、Autolayout、ViewController生命周期逐项掌握;最后是网络和存储,把HTTP协议和沙盒机制过一遍。

每学完一个模块,就用这套客观题里对应分类的题目做自测,错题整理成笔记,尤其要记录错误选项的迷惑点。如果你能做到合上答案后,能清晰解释每道题每个选项为什么对、为什么错,那这套题就不止是刷过一遍,而是真正消化了。

5.3 应考技巧与心态调整

最后说两个小技巧。第一,多选和判断题目里,凡是出现“一定”“必然”“总是”这种绝对化表述的选项,大概率是错的,因为技术方案很少有绝对;而出现“可能”“一般”“通常”这类相对化表述的,正确率会高一些。这不算玄学,而是出题人设计干扰项时惯用的手法。第二,笔试过程中如果遇到不会的题,不要空着,尤其是判断题,蒙一个也比空着强,毕竟倒扣分的情况在这套题里不多见。

心态上,客观题考察的是基础,基础问题失分比复杂问题失分更可惜。备考阶段应该把精力花在理解原理上,而不是追求刷题数量。这套客观题合集本身不是标准答案库,它的价值在于帮你发现哪些基础概念还没真正吃透。把这些缺口补上,比做完十套题都管用。

我后来带团队面人时,也偶尔会从这套客观题里挑几道问问候选人。说实话,能把“copy与strong修饰NSMutableString的区别”和“主队列调用dispatch_sync为什么死锁”这两道题答利索的人,基础都不会太差。一套题看下来,我最深的感受是:它考察的从来不是背了多少API,而是你对iOS开发底层机制有没有真正想明白。准备校招的同学如果时间有限,别急着刷海量新题,先把这份合集里暴露出来的基础盲区一个个补上,比什么都实在。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 18:05:42

R语言回归建模全流程:从lm到混合效应模型与GAM

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 16:37:37

IMU-GPS融合为何必须用间接卡尔曼滤波(IKF)

简介:本资源是一套面向导航算法初学者与自动驾驶感知方向学习者的MATLAB传感器融合实践项目,聚焦IMU与GPS数据的间接扩展卡尔曼滤波(IEKF)融合原理与实现。针对惯性导航漂移大、GPS定位易受干扰的痛点,通过纯仿真生成的…

作者头像 李华
网站建设 2026/9/5 8:31:47

NI-VISA与VisaNS.zip:仪器控制通信实战教程

简介:NationalInstruments.VisaNS.zip 是一套面向 LabVIEW、C、C#、Python 等开发场景的 NI VisaNS 动态库合集,适合需要控制 GPIB、串口、USB、以太网仪器设备的工程师和科研人员,可用于解决跨版本、跨平台程序调用时的接口与依赖问题。压缩…

作者头像 李华
网站建设 2026/9/3 15:53:35

深入理解C++ std::is_default_constructible_v

std::is_default_constructible_v 是 C17 引入的一个类型特性(type trait),用于在编译期判断某个类型是否可以被默认构造(即能否通过 T() 或 new T() 的形式创建对象)。它是一个变量模板,等价于 std::is_de…

作者头像 李华
网站建设 2026/9/2 19:00:13

从提示词到多镜头成片:MAVIN如何实现AI叙事视频生成

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华