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

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在对象释放后会自动置为nilassign则不会所以assign修饰对象类型会产生悬垂指针。第三个是block属性为什么要用copy在MRC时代block可能存放在栈上离开作用域后就会被回收必须复制到堆上才能安全持有虽然在ARC下编译器会自动处理一部分但用copy修饰依然是信号明确、安全性更高的写法。注意不要因为ARC下编译器做了优化就认为属性修饰符可以随便写。copy和strong在语义上仍有本质区别这不仅是笔试考点更是线上事故的常见源头。2.2 经典内存管理客观题与解析我再举一道很有代表性的题目给你一个对象A内部持有一个blockblock内部引用了A的一个属性问在ARC环境下是否存在循环引用如何解决。答案是存在循环引用解决方案是把self弱化为weakSelf在block内部再用strongSelf承接。这题难的不是答案本身而是它考察你是否理解“对象持有blockblock又捕获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、ATSApp 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开发底层机制有没有真正想明白。准备校招的同学如果时间有限别急着刷海量新题先把这份合集里暴露出来的基础盲区一个个补上比什么都实在。