拓冰建站拓冰建站
首页 / 资讯中心 / 正文

360校招iOS客观题考点拆解:核心基础与避坑指南

每年这个时候都能看到一批准备校招的同学对着“360校招技术岗-客观题IOS”这个标题发愁。客观题这东西说难不难说简单也不简单——它不像编程题那样给你充分的思考时间也不像项目深挖那样可以靠聊天的节奏缓解压力。它要求你在几十秒内判断一个知识点的对错很多题看似在考记忆实际在考你对iOS底层机制理解的“肌肉记忆”。我自己当年准备360校招的时候也刷过不少iOS客观题后来带团队也参与过校招出题。说实话360这类大厂的iOS客观题风格相对稳定覆盖范围集中在OC语言特性、Runtime、内存管理、多线程、RunLoop、网络和UI渲染这些硬核基础偶尔也会穿插几道iOS 16/17新特性或组件化、跨端方案的题考验候选人有没有跟进技术趋势。这篇内容我把准备这类客观题的经验、考点拆解、答题技巧和踩过的坑一次性写清楚给准备投递360iOS岗或者其他大厂iOS岗的同学做参考。1. 360校招iOS客观题到底在考什么1.1 题型分布与考察范围先聊大家最关心的问题360校招iOS岗客观题一般考哪些内容、什么题型。根据我自己的经验和身边同学的反馈这类客观题通常是选择题为主少量判断和填空考试时长一般控制在60到90分钟题量在40到60道之间平均一道题只有一分多钟基本没有太多纠结时间。从内容分布上看大致可以分成三个板块计算机通用基础包括数据结构、操作系统、网络基础、数据库。这部分和iOS本身关系不大但校招几乎必考比如TCP三次握手、进程线程区别、哈希冲突解决办法、二叉树遍历等。iOS专项基础这是重头戏占比通常在60%以上。重点在OC语言、Runtime机制、内存管理、RunLoop、多线程、UI事件传递、网络库原理等。前沿与扩展占比不大但每年都会有几道。比如iOS 16/17的新特性、Swift与OC的混编、组件化、跨端方案Flutter/RN/小程序、App性能优化与崩溃分析。这里有个很多人容易忽略的点360的客观题不全是纯iOS技术它还会考一部分“逻辑推理”和“阅读理解”类题目类似行测。这类题没有复习范围靠的是平时积累和临场状态建议考试时先跳过把时间留给技术题。1.2 客观题和Android/通用技术岗的差异点如果你同时投了360的iOS岗和其他技术岗会发现iOS方向的客观题有一个明显特点它考的不是“会不会用”而是“懂不懂原理”。举个例子。Android岗的客观题可能问“Activity的启动模式有哪些”这是偏记忆性的。但iOS岗更可能问“Category能否添加成员变量为什么”这种问题表面问能不能实际考的是你对OC类结构、关联对象机制的底层理解。如果只背过“能添加属性但不能添加成员变量”的结论不理解分类底层的结构体布局换一个问法就容易被带沟里。所以准备iOS客观题不能只刷题背答案要把每个考点背后的“为什么”搞清楚。这点在后面几个章节我会逐个拆开讲。2. 核心知识点拆解客观题里的高频考点2.1 OC语言特性与Runtime底层机制OC语言的题目在客观题里占的比重最大而且往往出得比较细。考得最多的几个方向包括分类Category、关联对象、消息发送与转发、KVC/KVO原理、atomic与nonatomic的区别、属性关键字等。关于Category几乎每年都有题。经典考法是下列哪些说法是正确的 A. Category可以添加实例方法 B. Category可以添加实例变量 C. Category可以添加属性并自动生成成员变量 D. Category的方法优先级高于主类方法正确答案是A。Category可以添加方法包括类方法和实例方法但不能直接添加实例变量。如果你声明了一个property编译器只会生成getter/setter的声明不会自动合成成员变量和实现需要你自己通过关联对象Associated Object实现存储。而“Category方法优先级高于主类”这个说法不够严谨准确说是分类方法会“覆盖”主类方法但这里的覆盖不是真的覆盖而是运行时分类的方法被放到了方法列表的前面查找时会先命中分类方法。如果一个类有多个分类且都实现了同一个方法最终调用哪个取决于分类的编译顺序最后参与编译的分类方法会被放在最前面。这个细节客观题经常挖坑。消息发送与转发也是高频考点。OC的方法调用本质是objc_msgSend查找流程是先找类的缓存cache_t再找方法列表method_list_t找不到就沿继承链往上找再找不到就进入消息转发流程。客观题喜欢问objc_msgSend的调用约定是什么参数和返回值怎么处理消息转发分几步动态方法解析 - 快速转发forwardingTargetForSelector - 完整转发methodSignatureForSelector forwardInvocationrespondsToSelector:判断的是哪个环节方法解析完成后、转发开始前这些问题看起来简单但如果不理解objc_msgSend的汇编实现和缓存机制遇到变体题容易出错。建议复习时把objc_msgSend的快速查找流程画出来把resolveInstanceMethod:、forwardingTargetForSelector:、methodSignatureForSelector:、forwardInvocation:各自负责的场景对应清楚。atomic与nonatomic也是几乎每年都出现的选择题。很多同学只知道“atomic是线程安全的nonatomic不是”但这个说法其实不准确。atomic只是保证了属性读写操作的原子性也就是self.name value这个操作的完整性并不保证对象内部属性的线程安全。比如一个NSMutableArray声明为atomic两个线程同时往里面addObject照样会崩。客观题如果问“atomic能否保证多线程操作对象的线程安全”正确回答是否定的。另外需要注意的是atomic会显著增加开销所以在日常开发中iOS开发基本都用nonatomic只有极少数需要跨线程读写基础类型属性的场景才用atomic。2.2 内存管理与AutoReleasePool内存管理的题核心就三个方向ARC规则、循环引用、AutoReleasePool的底层机制。ARC的题比较容易丢分的地方在于“什么情况下对象会被提前释放”。举个例子在ARC环境下以下代码中NSString对象在哪个时间点被释放- (void)viewDidLoad { [super viewDidLoad]; NSString *str [NSString stringWithFormat:hello]; NSLog(%, str); }正确答案是“在最近的autoreleasepool drain时释放”而不是“方法结束时”。因为stringWithFormat:返回的是autorelease对象ARC下编译器并不会在方法结尾为它插入release而是在当前所在autoreleasepool释放时才处理。如果方法里创建了大量的autorelease对象比如循环里创建大量临时字符串内存就会峰值很高这也是为什么要在循环体内手动加autoreleasepool的原因。关于循环引用客观题出题主要集中在这几种场景Block捕获self导致循环引用最常见NSTimer对target的强引用iOS 10之后要用block版本的timerdelegate用strong导致循环正确应该是weak父子对象互相持有经典的坑是Block循环引用。如果问你“在Block内使用__weak typeof(self) weakSelf后是否一定不会循环引用”正确答案是不一定还需要考虑延时执行场景。比如Block被strong属性持有且Block内使用weakSelf但这个block又被存储起来延时执行前面一个对象已经释放了weakSelf已经为nil此时某些必须执行的逻辑可能被跳过。所以“__weak一定解决循环引用”是个错误选项。另外如果Block内部使用了成员变量_name即便你用weakSelf修饰了self编译器仍然会强引用self因为访问成员变量本质上是通过self访问的所以要把成员变量提前赋值给局部变量再使用。这个细节很刁钻但大厂客观题就爱出这种。AutoReleasePool的底层实现也是客观题常客。常见问题是“AutoReleasePool的底层数据结构是什么”答案是__AtAutoreleasePool结构体内部维护一个_objc_autoreleasePoolPush和_objc_autoreleasePoolPop的栈结构。主线程RunLoop在每次事件循环开始时会push一个pool结束时pop。所以UI事件处理过程中的autorelease对象会在事件循环结束时统一释放。如果线程没有RunLoop比如后台线程需要手动管理autoreleasepool。有同学问“后台线程的autorelease对象什么时候释放”正确答案是“如果不手动创建autoreleasepool会在线程退出时释放 导致内存堆积”。2.3 多线程GCD、NSOperation与锁多线程的客观题基本逃不开GCD和锁这两块。GCD的考点集中在sync/async与串行/并行的组合会有哪些表现、dispatch_once的原理、dispatch_group的用法、dispatch_barrier_async的作用、死锁的产生条件。一个经典的坑题在主线程执行以下代码会怎样dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(hello); });答案是死锁。因为主线程在执行到这段代码时dispatch_sync会阻塞主线程并等待block在主线程队列中执行但主线程已经被阻塞了无法去执行block于是互相等待。很多人在这一步丢分不是不懂sync/async的区别而是忽略了“当前线程与目标队列相同”这个前提。同理如果在串行队列内部调用dispatch_sync到自己这个队列也会死锁。dispatch_barrier_async也是个出题点。它只能在使用dispatch_queue_create自己创建的并发队列上才有隔离效果如果放到其他队列行为跟dispatch_async没有区别。题目经常写“所有队列使用barrier都能保证读写隔离”这就是错误选项。另外dispatch_barrier_sync和dispatch_barrier_async的区别也是考点前者会阻塞当前线程后者不会。锁相关的题主要考各种锁的性能、特性与使用场景。比较常见的问法是“以下哪种锁在等待时不会占用CPU资源”答案是互斥锁、条件锁、递归锁这类会休眠的锁而不是自旋锁spinlock。自旋锁忙等会占用CPU后来苹果用os_unfair_lock替代了OSSpinLock也是因为优先级反转问题。还有synchronized的底层是递归互斥锁可重入但性能开销大。这道题很多人只看结论不看原理遇到“自旋锁和互斥锁的本质区别”就懵其实关键就在“忙等 vs 休眠”。2.4 RunLoop、UI事件与渲染RunLoop在客观题里出现的频率非常高因为它牵扯到主线程的工作模式、事件处理、定时器、界面刷新等一系列机制。常见考点RunLoop的Source0、Source1、Timer、Observer分别处理什么performSelector:withObject:afterDelay:在子线程里能不能正常触发setNeedsLayout与layoutIfNeeded的区别滑动时NSTimer为什么停止触发“NSTimer在滑动时为什么会暂停”是道高频题。原因是滑动时RunLoop会切换到UITrackingRunLoopMode默认的Timer是添加在kCFRunLoopDefaultMode下的Tracking模式下不会执行Default模式的Timer。解决办法是把Timer加入NSRunLoopCommonModes或者改用CADisplayLink。客观题选项里经常出现“NSTimer添加错了RunLoopMode”这正是关键。UI事件传递的题也不难但容易漏。考察范围hitTest:withEvent:的执行流程、事件响应链顺序、UIControl和UIGestureRecognizer的优先级。这块出题相对套路化记住“先反向遍历子视图再命中测试命中后沿响应链向上传递”即可。UIGestureRecognizer和UIControl同时存在时UIControl的事件优先手势识别器会延迟这是系统默认行为。渲染相关的题这两年越来越多尤其是“离屏渲染”的概念。常见问法是以下哪种操作会触发离屏渲染 A. 设置view.layer.cornerRadius B. 设置view.layer.masksToBounds YES C. 设置view.layer.shadowOpacity D. 设置view.alpha正确答案是C而A和B同时使用时也会触发离屏渲染圆角裁剪。如果只是设置cornerRadius没有裁剪不会触发离屏渲染。另外设置shadowPath可以避免shadow引发的离屏渲染。这类题考的是对渲染流程的理解不是死记结论。2.5 网络HTTP、TCP与HTTPS网络部分的客观题iOS方向和其他技术岗类似但会加一些iOS特有的考题比如NSURLSession的并发限制、ATSApp Transport Security的限制等。通用网络部分高频考点是TCP三次握手与四次挥手、TCP与UDP的区别、HTTP1.0/1.1/2.0的区别、HTTPS的TLS握手过程。这里容易丢分的是“HTTPS一定安全吗”这类题正确答案是不一定因为HTTPS只能保证传输过程中加密如果客户端不做证书校验比如允许自签名证书中间人攻击依然可能发生。360这种安全背景的公司特别喜欢在客观题里加一道类似“客户端如何防止HTTPS中间人攻击”的题选项里通常会有一个“不校验证书直接信任所有证书”这肯定是错的。iOS特有网络考点ATSiOS 9之后默认要求所有请求使用HTTPS如果要允许HTTP请求需要在Info.plist里配置NSAppTransportSecurity例外。客观题可能问“配置NSAllowsArbitraryLoads YES能否通过App Store审核”答案是审核有概率被拒苹果对arbitrary loads的审核比较严格需要给出合理说明。NSURLSession与NSURLConnection的区别NSURLConnection已在iOS 13废弃NSURLSession支持后台下载、断点续传、多线程并发等。Alamofire/AFNetworking的底层依赖底层都是NSURLSessionAFNetworking之所以还能兼容旧项目是因为封装了更多上层能力。2.6 iOS 16/17 新特性与Swift混编客观题里偶尔也会出几道“iOS 16/17中提到的新API”相关的题考你平时关不关注系统更新。这类题不难但如果你完全没关注过就只能靠排除法蒙。iOS 16的几个大变化Lock Screen自定义WidgetKit的锁屏组件、Metal 3、Passkeys、Focus Filter等。iOS 17的变化则包括StandBy模式、交互式Widget、Contact Posters、Check In平安确认等。Swift 5.9引入了宏Macro和Observed macro特性。这些只要大致了解即可不会出太难。Swift混编的题就比较实际了比如“OC项目引入Swift文件需要在工程中开启什么配置”Defines Module设为YES、“Swift类暴露给OC需要加什么修饰符”objc和objcMembers、“OC和Swift混编时为什么不能继承Swift的泛型类”等。这类题是送分题但前提是你真的混编过只背概念容易混淆。3. 容易被客观题“偷袭”的扩展考点3.1 iOS架构模式与组件化360的iOS岗客观题里架构题占比虽然不如基础题多但几乎年年有。考点集中在MVC、MVVM、MVP、VIPER几种模式的区别以及组件化、模块化的落地方式。题目经常这样出在MVVM架构中以下哪个角色负责将ViewModel的数据变化反映到View上 A. Model B. View C. ViewModel D. ViewController正确答案是View。MVVM的核心是ViewModel通过绑定机制KVO、Block、RxSwift、Combine向View主动推送数据变化View负责展示。很多人误以为ViewModel是中间层所有东西都经过它但实际上View和ViewModel是绑定的不是单向传递。这题如果没理解MVVM的绑定思想很容易选成C。组件化相关的题考察的是对“路由”“中间件”“服务注册”等概念的理解。比如“组件A需要调用组件B的某个页面最合理的做法是什么”选项可能有直接依赖B、通过路由URL跳转、把B的代码拷贝到A、通过单例共享。正确答案是通过路由URL跳转因为这样可以解耦。如果题目问“cocoapods和carthage的区别”核心区别是CocoaPods会生成一个workspace并修改工程结构Carthage只编译生成framework由开发者手动添加依赖不改动工程结构。这也是送分题但需要平时实践过才知道。3.2 跨端与混合开发方案这几年大厂越来越关注跨端方案iOS客观题也会顺带考一两道。Flutter、React Native、小程序、H5混合开发都有可能出现。最常见的题目以下哪种跨端方案最终渲染不依赖系统原生控件 A. React Native B. Flutter C. 小程序 D. H5正确答案是B。Flutter通过自绘引擎Skia直接绘制UI不依赖iOS原生控件React Native最终渲染的是原生控件小程序在iOS上也是用原生组件渲染。这道题考的是对跨端方案技术原理的理解只背了“Flutter性能好”是不够的。另外还有一道高频题是“WKWebView与UIWebView的区别”虽然UIWebView已经废弃很多年了但面试题里还是会出现。区别点包括WKWebView内存占用更小、支持JS调用原生方式更安全高效、崩溃不影响App、支持更多HTML5特性、进程独立。如果选项里有“WKWebView一定不会崩溃”这是错的它只是崩溃不会拖垮整个App因为独立进程实际是独立WebContent进程。这个细节容易失分。3.3 性能优化、崩溃排查与自动化测试性能优化的客观题考察点集中在启动时间优化、卡顿优化、内存优化、包体积优化、耗电优化。常见的出题方式App启动时间过长以下哪项优化措施最有效 A. 将部分load方法中的逻辑改为initialize或首用懒加载 B. 将启动时执行的同步网络请求改为异步 C. 将AppDelegate中的逻辑移到子线程执行 D. 减少启动时加载的图片资源这道题其实多项都对但如果是单选题最核心的是A。因为load方法是在类加载时同步执行的如果里面有耗时操作会阻塞启动而initialize是懒加载的首用时才执行。B和D也是优化点但客观题如果规定单选选最根本的那个。注意load与initialize的区别也是独立考点必须记清楚load类或分类被添加到运行时环境时调用程序启动加载镜像时不管有没有使用都会调用且父类先于子类。initialize类首次收到消息第一次调用类方法或创建实例前调用如果类一直没被使用不会调用。崩溃分析相关的题考的是对常见崩溃类型的理解。比如EXC_BAD_ACCESS是什么访问了已释放的内存、SIGSEGV和SIGABRT的区别、如何用符号表解析崩溃日志。360本身做安全所以针对崩溃日志的题可能比别家更细。比如“dSYM符号文件的作用是什么”正确答案是“将崩溃日志中的内存地址解析为函数名和行号”而不是“防止App被反编译”这种干扰项。自动化测试这块高频考点是XCTest框架、UI测试、性能测试、代码覆盖率。题目一般比较简单比如“XCTest中setUp方法的作用是什么”这种属于送分题。但有一个坑“XCTestCase中的测试方法命名有什么要求”正确是以test开头带参数的方法不会被识别。3.4 iOS开发者证书、签名、打包与上架关于证书签名和打包的客观题基本是每年校招的必考送分题。考点集中在开发者证书的作用、Bundle Identifier和签名机制、描述文件Provisioning Profile、App ID与设备管理、TestFlight与App Store上架流程。常考题以下关于iOS签名的说法正确的是 A. 证书是用来表示开发者身份的 B. 描述文件的作用是声明App的权限和可用设备 C. 重签名可以绕过App Store审核 D. 开发者证书分为Development和Distribution两种正确答案是A、B、D。C是错的重签名只能用于企业分发或开发调试App Store的审核与签名机制绑定重签名无法绕过审核。另外还有一道经典题“开发环境和发布环境的Bundle Identifier是否必须一致”答案是必须一致改变Bundle Identifier相当于一个新的App描述文件和证书都要重新配置。有人说“改了Bundle Identifier也能跑”那只是改了三方SDK等配置后在开发机上运行但上架和推送等都会出问题。打包流程相关的题可能会问“Archive和Release的区别”本质是Archive会生成ipa包和dSYM符号文件Release的优化选项默认开启。还有一种问法“发布到App Store需要哪种证书”答案是Distribution证书或App Store Connect相关的发布证书。这类题如果自己没走过一遍上架流程很容易把开发证书和发布证书搞混。3.5 iOS调试、抓包与性能分析工具这类题看起来偏实操但客观题里也会出现尤其360这种工具型公司的校招喜欢考“你懂不懂调试工具的原理和用法”。高频考点LLDBpo命令是输出对象描述expr是执行表达式bt是打印调用栈image lookup是查找地址对应符号。题目可能给一段操作问命令作用。InstrumentsTime Profiler分析CPU耗时、Allocations分析内存分配、Leaks检测内存泄漏、Core Animation查看帧率。常考“App卡顿应该用Instruments的哪个工具”答案是Time Profiler或Core Animation看帧率。Charles抓包原理本质是中间人代理通过安装CA证书解密HTTPS流量。题目可能问“为什么Charles能解密HTTPS请求”正确答案是“在设备上安装了Charles的根证书客户端信任该证书后进行SSL/TLS中间人解密”。这里注意苹果在iOS 10之后要求App默认信任用户安装的CA证书需要在Info.plist里配置NSAppTransportSecurity的NSAllowsLocalNetworking或NSExceptionDomains才能抓包某些HTTPS请求。很多同学会在这一步踩坑但客观题一般只考到“根证书”这个层面。3.6 iOS设备模拟与常见开发工具链还有一类偏工具链的题目尤其是现在很多iOS岗位的JD里都写了“熟悉iOS模拟器调试”。客观题可能会考iOS模拟器Simulator和真机的区别模拟器使用Mac的CPU和内存架构是x86_64或Apple Silicon上的arm64不支持某些硬件能力比如相机、步数传感器、Taptic Engine所以“模拟器可以模拟摄像头”是错误选项。模拟器和真机的CPU架构差异导致的编译问题模拟器是x86_64或arm64_sim真机是arm64。打包时如果只包含arm64架构模拟器无法运行需要在Build Settings里配置VALID_ARCHS/EXCLUDED_ARCHS。Xcode的开发工具链xcodebuild命令行打包、xcode-select切换Xcode版本、xcrun simctl管理模拟器。这些题对做过实际开发的同学来说是送分但对只刷题没实际操作过的同学来说很容易在模拟器和真机的区别上丢分。比如“iOS模拟器是否支持调用IMessage发送短信”不支持模拟器不能发短信和打电话。这类常识题平时用模拟器跑过一次就会了。4. 客观题的刷题方法与答题技巧4.1 选择题的“排除法”和“绝对词判断法”客观题里很多选项是有明显破绽的尤其是用了一些绝对化的词。记住一个规律技术类选择题里出现“一定”“肯定”“所有”“都”“不会”这类绝对词的选项大概率是错误的。比如上面的示例“__weak一定解决循环引用”“WKWebView一定不会崩溃”“atomic一定线程安全”——这些都是错误的因为技术方案往往没有绝对的保证。反过来如果选项里有“在某些情况下”“可能”“取决于具体实现”这往往是正确选项。这不是玄学而是出题人故意设置的陷阱把一个有条件成立的结论包装成绝对结论。不过要提醒一句这个规律不能滥用。有些场景下“一定”反而是正确的比如“在主线程调用dispatch_sync到主队列一定会死锁”。这种是确定性的结论必须用知识本身去判断不能只靠“绝对词”猜。4.2 文字题的“概念对比记忆法”iOS客观题里有很多“概念对比”题strong vs weak、copy vs strong、sync vs async、串行 vs 并行、load vs initialize、Frame vs Bounds、setNeedsLayout vs layoutIfNeeded。这种题与其一道一道刷不如自己做一个对比表格把每个成对概念的定义、本质、使用场景、坑点写在一起对比记忆效率更高。比如copy vs strong这组copy修饰的NSString属性赋值时会发送copy消息产生一个不可变副本。如果原值是NSMutableStringcopy后变为NSString后续修改原值不影响副本。strong修饰的NSString属性只是增加引用计数如果原值是NSMutableString可以在外部被修改导致属性值变化出现不可预期的结果。所以正确写法NSString用copyNSMutableString用strongNSArray用copyNSMutableArray用strong。这道题在客观题里已经出现过很多次但每次还是有人丢分就是因为只背了“NSString用copy”没有理解copy的真正行为。如果你能用自己的话把”原值是可变对象“这个场景讲清楚基本就能稳拿这类题。4.3 记忆型考点的“口诀化”整理有些知识确实需要记忆比如消息转发的流程、响应链的顺序、GCD的不同组合表现。这些内容最好整理成口诀或者卡片在考试前一遍遍过。我自己的口诀消息查找“自己缓存找找不到往父类跑父类没有进转发”。消息转发“一问能不能动态加resolveInstanceMethod二问能不能找别人forwardingTargetForSelector三问能不能完整装methodSignatureForSelector forwardInvocation”。响应链“事情先看谁点的hitTest点了以后沿链传nextResponder没人处理就丢弃”。RunLoop“Source0是事件Source1是内核Timer是定时Observer是哨兵”。口诀不要求押韵关键是建立场景感。考试时看到相关题目脑子里能快速联想出流程。4.4 做题顺序与时间分配建议360的客观题如果有行测题我建议先做行测或先做技术题都行但一定要选一个自己更稳的先做。就iOS岗来说我建议顺序是先做iOS技术题你最熟悉的部分拿分主力。再做计算机通用基础。最后做行测/逻辑推理和陌生拓展题。原因很简单技术题你有把握做对了能稳住状态。行测题容易卡住一卡就是五分钟影响后续答题节奏。如果你先做行测遇到难题心态容易崩然后技术题也会受影响。考试时间有限一道题思考不要超过90秒超过就先标记最后回头再看。另外提醒一点主观题如果遇到完全不会的可以先空着等做完其他题后再回来猜。很多平台的不定项选择题是“少选得部分分选错不得分”如果拿不准宁愿少选也不要多选。但如果题目明确说“多选、错选不得分”那就要根据把握程度决定是否保守。5. 踩坑实录客观题中常见失分原因与应对5.1 因为“只背结论不懂原理”而失分的坑最常见的失分原因就是只背了结论没有理解底层的机制。因为大厂客观题为了保证区分度喜欢把同一个知识点换一个问法。一旦你不是真懂原理换个问法就露馅。我自己当年踩过的一个坑是Category这道题。我背了“Category不能添加成员变量”但考试时题目问的是“Category可以添加属性吗”我当时想“属性”和“成员变量”不是一回事吗就选了错误。但实际上Category可以添加属性property只是不会自动生成成员变量和getter/setter的实现需要手动实现或使用关联对象。这道题看起来和我背的结论冲突实际上只是考察得更细了。如果你只看结论不理解“属性 成员变量 getter setter”这个组合概念就会掉坑。应对方法每刷一道题不管做对做错都去把每个选项为什么对、为什么错搞清楚顺便回忆下相关的知识体系。不要只记正确项那样等于白刷。5.2 因为“忽略场景条件”而失分的坑不少iOS客观题是“给一段代码问运行结果”的形式。这类题最怕忽略运行场景。比如以下代码在子线程中执行会怎样dispatch_queue_t queue dispatch_queue_create(test, DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ // 代码A }); dispatch_barrier_sync(queue, ^{ // 代码B });如果不看“子线程”这个条件很多人会以为barrier_sync会死锁。实际上barrier_sync阻塞的是当前线程这里是一个后台线程而不是主线程所以不会死锁只是当前线程会等待队列前面的任务完成后再执行barrier然后继续。这类题的关键词是“当前线程”做题时一定要圈出来。还有一种场景坑题目给了autoreleasepool在for循环内部问你“每轮循环结束后某个对象是否释放”。如果不注意autoreleasepool的作用域可能以为runloop结束时才释放。应对方法做题时把代码里的“线程”“队列”“作用域”“是否在主线程”这些关键词用笔圈出来逐字读题千万别只看主干。大厂客观题故意在这些细节上设置陷阱就是为了筛选使用记忆而不是理解的候选人。5.3 因为“新特性题靠瞎蒙”导致的额外失分前端时间有同学问我iOS 16/17新特性的题怎么准备总不能把WWDC每年的session都看完吧。其实不用那么夸张每年校招考前把最近两代iOS的主要更新点过一遍就够了。重点看这几个维度UI相关是否新增交互方式或组件比如iOS 14的Widget、iOS 16的Lock Screen、iOS 17的StandBy并发相关是否引入新的并发API比如Swift Concurrency架构相关是否引入新的框架比如SwiftUI、Metal 3安全相关隐私权限的变化比如App Tracking Transparency这些信息在苹果开发者官网的“What’s New”页面都有汇总考前刷一遍半小时足够。如果你连iOS 17出了StandBy都不知道遇到“以下哪个是iOS 17新增功能”就只能靠蒙一分也是分。5.4 因为“基础不牢”而失分而不是题太偏说实话大部分iOS客观题失分不是因为题太难而是因为基础不够扎实。很多同学平时用CocoaPods、AFNetworking、SDWebImage用得滚瓜烂熟但问他“SDWebImage的缓存策略是LRU还是FIFO”他答不上来问“AFNetworking的JSON序列化是怎么做的”他也没细看。其实这些框架底层都是iOS基础知识的体现面试官问你框架原理本质上还是在考基础。如果让我给一个可量化的准备方案我会建议刷300道iOS相关选择题 150道计算机基础选择题然后把错题按“Runtime”“内存管理”“多线程”“RunLoop”“网络”“UI渲染”六个板块分类整理。错题本比刷题量更重要二刷错题的时候能明显感觉同一个知识点的不同考法。客观题准备过程中我还发现一个很有用的方法把自己当成出题人。每学完一个知识点就试着出一到两道选择题选项里故意放一两个迷惑性选项。这个方法看起来费时间实际上非常高效相当于强制自己从“知道”升级到“理解”。比如学完消息转发可以自己出题“以下哪种消息转发方式可以不修改原始方法而将消息转发给另一个对象实现”这个问题就逼着你理解forwardingTargetForSelector:和forwardInvocation:的区别。5.5 实操建议考试前一周的冲刺清单如果你的考试时间只剩一周建议按以下优先级安排前3天过一遍Runtime、内存管理、多线程、RunLoop这四大板块的笔记或错题本。这是iOS客观题的高频主力不能丢分。第4天刷一遍网络基础TCP/HTTP/HTTPS OC语法题尤其是Block、属性修饰符、KVC/KVO这些容易出细节题的考点。第5-6天做2-3套模拟客观题卡时间做练习答题节奏和心态。重点看错题不要贪多。第7天快速浏览iOS 16/17新特性、证书打包上架流程、架构设计模式这几个“送分板块”确保冷门题不丢分。最后一天不要刷难题了把以前做错的知识点重新过一遍看看dSYM是什么、load和initialize的区别、消息转发三步曲这些容易考又容易混淆的点心态放稳点。还有一个小提醒考试时如果用的是在线笔试系统注意代码题和判断题的输入格式不要因为格式问题白白丢分。有些系统要求大写“A/B”有些要求写完整选项内容最好提前看清楚页面说明。6. 从客观题到面试怎么把准备的东西“变现”6.1 客观题里的知识点面试里会怎么继续问很多人觉得客观题和后续面试是两回事其实不然。客观题是初筛面试是深挖。你客观题里答对了Category能添加属性但不能添加成员变量面试里面试官就会追问“那如果确实想添加成员变量应该怎么做关联对象的原理是什么关联对象的生命周期和什么时候被释放”如果你只背了结论没有理解原理面试很容易露怯。所以准备客观题的时候可以顺手想想这道题如果是我来深挖我会问什么把每个高频考点想好一个“追问链”面试时就从容很多。比如“Block循环引用” - 追问Block的三种类型Global/Stack/Heap分别是什么__block的作用是什么Block在栈上时为什么不能修改外部变量用__block修饰后为什么就能修改“atomic不能保证线程安全” - 追问如果要保证数组操作的线程安全应该怎么做iOS开发中有哪些常用的线程安全方案锁、队列、信号量“RunLoop的Mode” - 追问SDWebImage为什么在图片解码时要用子线程 RunLoop图片解码会卡住主线程吗“离屏渲染” - 追问圆角裁剪为什么触发离屏渲染有哪些替代方案预先裁剪图片、使用shadowPath等离屏渲染一定性能差吗这些追问链本质上还是在考基础但需要你将知识点串联起来。客观题准备阶段就把这些链条建立起来面试会轻松很多。6.2 客观题刷题与项目经验的结合点最后说一个重要心得客观题刷题、项目经验、面试深挖这三者不是割裂的而是互相打通的。准备客观题的最大价值不只是通过笔试更是帮你整理iOS知识体系让你在项目的每个技术选型上都更有底气。举个例子如果你在项目里做过图片加载优化你可以顺手把SDWebImage的缓存策略、解码策略、磁盘缓存清理时机都过一遍这些既可能出现在客观题里也可能是面试中“聊一聊你做过的最有挑战的事情”的素材。同理你做过组件化就可以把路由、依赖注入、持续集成这些点串起来。客观题其实是一面镜子照出你知识体系里的短板补短板的过程就是提升的过程。我自己的体会是准备大厂iOS岗的笔试与其刷1000道题不如把100个核心知识点研究透。比如Runtime的消息发送机制不是靠背文段而是去看一下源码中objc_msgSend的快速查找逻辑理解缓存未命中后是如何通过二分查找在方法列表中定位的。当你理解了“为什么会这样设计”很多选择题的选项在你眼里会变得非常清晰因为错误选项偏离了设计初衷。最后还是回到那句话客观题不求全对但求基础不丢分、陷阱不踩坑。把今天讲的这几个高频知识板块过扎实再加上适合自己的答题节奏360校招的iOS客观题就没有想象中那么可怕。希望这篇内容能给你提供一个清晰的复习抓手祝大家笔试顺利。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门