☰
京东2019校招iOS笔试真题解析:考点、解法与备考策略
2026/10/27 20:51:31 网站建设 项目流程

每年秋招季,总有人来找我聊京东2019校招笔试iOS开发工程师笔试题。说实话,这套题放在今天看,依然是很有代表性的“大厂风格”:选择题考的是基本功的边角料,编程题考的是算法功底,中间还穿插着一些让你纠结半天的多选题。我当年刷题时也踩过不少坑,后来面过一些应届生,发现大家在准备这类笔试时普遍存在一个误区——把精力全花在背API和语法细节上,反而忽略了“设计思路”和“边界处理”这些真正拉开差距的东西。

这篇文章我不打算只给题和答案,而是把京东2019校招笔试iOS开发工程师笔试题背后的考点、解法逻辑、答题技巧一起拆开讲。不管你是准备校招的在校生,还是想跳槽大厂的初级开发,只要按这个思路来复盘,基本能覆盖绝大多数iOS基础面试题的核心范围。文中涉及的代码、参数、方案都是按我实际验证过的路子来写的,你可以直接拿去用。

1. 京东校招笔试:一场怎样的考试

1.1 笔试在整个校招流程中的定位

京东的校招笔试通常安排在简历筛选之后、技术面试之前,线上OJ系统做题,时间一般控制在90分钟左右。题型以选择题(单选+多选)和编程题为主,个别年份还会加入简答题,但简答题的比例不高。

从筛选逻辑上看,笔试承担的是一个“漏斗”职能:在几百上千份简历里快速筛出基础扎实、代码能力过关的候选人。所以你会发现笔试题有一个特点——题目覆盖面广但单题深度不大。它不需要你把某个底层原理写到源码级,但要求你每个基础知识点都“见过、用过、知道为什么”。

我当时做这套题的感受是:选择题里至少有一半是“一看就知道”的题,另外一小半属于“凭经验能排除两个选项、剩下两个靠猜”。真正有区分度的是编程题——它不考iOS特性,考的是算法和编码习惯,这两样恰恰是很多人日常开发中最容易忽视的。

1.2 考察维度:从语法到体系化思维

拆开京东这套iOS笔试题,考点大致分布在五个维度:

  • Objective-C语言特性:property修饰符、block、Category、KVC/KVO、内存管理规则。
  • Foundation框架:NSString、NSArray、NSDictionary的底层行为,copy与mutableCopy的区别,字符串截取、拼接、比较的坑。
  • UI与布局:UIView与CALayer的关系、Auto Layout原理、ViewController生命周期、UITableView的优化点。
  • 多线程与并发:GCD、NSOperation、线程同步。
  • 网络基础:HTTP/HTTPS、TCP/UDP差异、状态码语义。

这些考察方向其实是“iOS开发工程师日常工作所需的最小知识集合”。如果你平时只依赖Storyboard拖控件、AFNetworking发请求,很多题会觉得“没学过”,因为笔试不会考框架API,它考的是框架下面的那层东西。

1.3 为什么值得复盘一份2019年的题目

有人会问:“2019年的题,现在还有参考价值吗?”我的回答是:有,而且价值不小。iOS底层和Objective-C语言规范这几年没有本质变化,ARC的内存管理规则、Runtime的消息转发机制、GCD的队列机制仍然是今天面试的核心。

真正变化的只是技术热点,比如Swift的占比、SwiftUI的引入、跨端方案的流行。但京东这类公司在校招时,依然默认候选人以Objective-C为主语言,Swift能力属于加分项。所以这份2019年的笔试题,对准备今天校招的同学来说,依然是很好的“基本功自测清单”。

2. 高频考点拆解:这些题到底在考什么

2.1 内存管理:引用计数、ARC与循环引用

内存管理是iOS笔试的“必考大题”,几乎每次都会出现。它的核心是引用计数。你可以把每个OC对象想象成一辆共享单车,引用计数就是“有多少人正在使用这辆车”。没人用了,系统才会回收。

ARC在编译期自动插入retain/release,但这不代表你可以完全不理解引用计数。笔试常考的点有这么几个:

  • weak与assign的区别:weak修饰的对象在释放后会自动置为nil,而assign不会。如果你用assign修饰delegate,对象释放后指针变成野指针,再访问就是野指针崩溃。这个知识点几乎是必考。
  • block为什么会造成循环引用:因为block会捕获外部变量。当对象持有block,block又强引用了对象,就会形成“你等我、我等你的死局”。
  • NSString用copy还是strong:正确答案是copy。因为传进来的可能是NSMutableString,如果只做强引用,外部可变字符串一改内容,你的属性也跟着变,这是很大的坑。

从我的经验来看,选择题考循环引用的频率极高,下面这个场景你可以记一下:

self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];

这段代码的问题在哪?在iOS 10之前,NSTimer会对target做强引用,于是timer持有self,self又持有timer,循环就产生了。现代写法应该用block版本的定时器,或者在适当的时机主动invalidate。

2.2 Runtime与消息转发:动态性的根基

“OC是一门动态语言”这句话谁都会说,但笔试题会考到具体机制。Runtime的核心是objc_msgSend——给对象发消息,实际上是走一条查找方法的流程:

  1. 先在当前类的method cache中查找方法。
  2. 找不到就去class的method list里查找。
  3. 再找不到就沿继承链往上找。
  4. 最终都找不到,进入消息转发流程。

消息转发的三个机会经常考:resolveInstanceMethod(动态添加方法)、forwardingTargetForSelector(把消息转给另一个对象)、forwardInvocation(完整消息转发)。笔试问你“OC对象调用一个不存在的方法会发生什么”,完整回答就是:先崩溃,但如果实现了消息转发,可以在崩溃前拦截并处理。

这里有一个实操层面的技巧:接管消息转发可以帮你实现很多“黑科技”,比如给Category添加属性、AOP埋点等。但笔试只需要你把流程说清楚,不需要你写一套完整的转发实现。回答时按照“动态方法解析 → 快速转发 → 完整转发 → 抛出异常”这个顺序来,基本就能拿全分。

2.3 多线程与并发:别只会用dispatch_async

很多人在项目里用GCD写两三个异步请求就以为自己懂多线程了,但笔试会对得更细:

方案底层特点适用场景
NSThread线程对象轻量、需要手动管理生命周期简单后台任务
GCDC语言接口、线程池自动管理线程生命周期、使用队列绝大多数异步任务
NSOperationQueue基于GCD封装支持任务依赖、取消、最大并发数控制复杂任务编排

有一道高频题是:“在serial queue上同步执行一个block,会发生什么?”答案是死锁。因为同步提交的任务要在当前线程执行完毕才能返回,而当前线程正阻塞在等待上,就像你左手拉右手,谁也动不了。

我建议你把GCD的常用API熟记:dispatch_async、dispatch_sync、dispatch_group、dispatch_semaphore、dispatch_barrier、dispatch_after。要能说清它们各自“阻塞/不阻塞当前线程”的行为。

2.4 网络基础:HTTP与HTTPS的工作细节

iOS开发离不开网络,但笔试考的不是AFNetworking的用法,而是协议本身。常见考点包括:

  • HTTP状态码语义:200、301、302、400、403、404、500、502、504分别代表什么。特别要注意302和301的区别——301是永久重定向,302是临时重定向。
  • GET和POST的区别:不要只背“GET用URL传参、POST用body传参”,从语义上看,GET是安全且幂等的,POST不是。
  • TCP三次握手:为什么要三次而不是两次?因为要确认双方的接收能力和发送能力都正常。
  • HTTPS握手过程:客户端拿到证书 → 验证证书合法性 → 协商对称密钥 → 后续用对称加密通信。核心是“非对称加密交换密钥,对称加密传输数据”。

笔试里最容易丢分的是多选题,因为网络概念常常好几个选项“看起来都对”。我的经验是:凡是提到“一定”“彻底”“总是”这类绝对化词,大概率是错误选项。协议在设计时几乎都有例外。

3. 典型机试题解析:答题思路比答案更重要

3.1 哈希类题目:从字符串处理到字典设计

京东这套题里有个字符串相关编程题,大致是要求找出字符串中最长不重复子串的长度。题目不难,但能看出编码风格。

我的推荐解法是滑动窗口,时间复杂度O(n):

#include <stdio.h> #include <string.h> int lengthOfLongestSubstring(char * s) { int map[128] = {0}; int left = 0, right = 0, maxLen = 0; int len = (int)strlen(s); while (right < len) { char c = s[right]; if (map[(unsigned char)c] > left) { left = map[(unsigned char)c]; } map[(unsigned char)c] = right + 1; int curLen = right - left + 1; if (curLen > maxLen) { maxLen = curLen; } right++; } return maxLen; }

这道题考察点不是“会不会调库”,而是:

  • 是否理解滑动窗口的原理。
  • 是否能处理边界条件(空字符串、全重复字符、全不重复字符)。
  • 是否注意到ASCII码越界问题——char类型有符号,直接下标访问会变成负数。

笔试OJ一般支持C/C++/Java,不支持Objective-C也没关系,算法题本来就不绑定语言。

3.2 链表类题目:检查基本功扎不扎实

还有一道常见的链表反转题。很多人觉得简单,但真到白板编程或OJ上,边界条件一多就出错。

关键在于“三个指针”:pre(前驱)、cur(当前)、next(后继)。

struct ListNode* reverseList(struct ListNode* head) { struct ListNode *pre = NULL; struct ListNode *cur = head; while (cur != NULL) { struct ListNode *next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; }

笔试阅卷时人力有限,不一定每题都人工看,所以代码的变量命名、结构体定义、返回值逻辑这些细节很重要。清清爽爽的代码至少不会在人工复核环节吃亏。

3.3 为什么笔试题往往不直接考iOS

很多人备考时只刷iOS题,结果发现编程题全是算法,心里发慌。这是正常的——大厂的笔试逻辑是“技术人可以培养,但逻辑思维和编码能力短期补不上”。iOS知识点可以靠培训速成,算法能力不行。

所以我的建议是:备考期间每天留1到2小时刷LeetCode,优先刷“数组、字符串、链表、二叉树、动态规划”这五类高频题。不要追求难题,把easy和medium练熟就够了。

4. 答题策略:如何在有限时间内拿更多分

4.1 先做会做的,再啃不会的

线上笔试时间有限,我见过太多人卡在一道多选题上十分钟,结果后面的编程题没时间写。正确策略是:

  • 快速浏览全卷,标注出“一眼有答案”的题。
  • 第一步做选择题,没有把握的先选一个最可能的,再标记出来。
  • 第二步做编程题,先写暴力解拿到部分分,再优化。
  • 最后回过头来重做标记过的题。

4.2 选择题排除法:正确率提升50%

iOS笔试题里,很多选项是“看起来很对但经不起推敲”的陷阱。做选择题时建议用排除法:

  • 选项中出现“所有”“任何”“一定”等绝对化说法,大概率错误。
  • 选项中出现“ARC下不能使用retain/release”这类表述,通常是对的,因为ARC确实禁止手动管理引用计数。
  • Option中“strong和copy修饰block”,正确的实际上是copy,原因前面讲过。
  • 选项中出现“dispatch_async会阻塞当前线程”,这是错的,dispatch_async本身就是异步执行的意思。

多选题就一个原则:不确定的选项宁可不选,也别瞎选。很多考试规则是多选、少选、错选都不得分,不会给你部分分。

4.3 编程题:先写注释再写代码

我在实际做笔试时发现一个很好用的习惯:先写注释,把算法思路写清楚,再在注释旁边补代码。这样有两个好处:

  • 思路清晰,不会写着写着忘掉逻辑。
  • 如果时间不够没写完,至少评委能看到你的思路,有可能给部分分。

另外注意编程题的输入输出格式。很多人算法写对了,结果scanf/printf的格式和题目要求不一致,直接判0分。我也是踩过这个坑之后才明白:笔试最冤的不是不会做,而是格式错。

5. 备考路线:怎么准备才能覆盖大厂考点

5.1 不要把宝全押在“刷题”上

身边不少学弟学妹问我:“学长,我每天刷200道OC语法题,笔试能过吗?”我的回答是:不够。语法题刷得再多,也只是把“已知”变成“熟悉”,而笔试更看重“未知推演能力”。

正确的备考结构是“三条腿走路”:

  • iOS基础知识体系:内存管理、Runtime、Runloop、多线程、网络、UI布局,做到能讲清楚原理。
  • 算法与数据结构:LeetCode高频题刷到“看到题目就有思路”的程度。
  • 项目实战复盘:自己做过的小项目,必须能把每个技术选型的理由讲出来。

笔试题里有时候会出现“你在项目中遇到最难的问题是什么”这类开放题,这不是简历面才有的,笔试简答题也考。这部分没有标准答案,但最能看出候选人是不是真的在写代码,还是在划水。

5.2 善用工具:从抓包到模拟器

备考时也可以用一些工程化工具帮自己加强理解。比如Charles抓包,可以直观看到App发出的每一个HTTP请求的Header、Body、状态码,对理解HTTP协议帮助很大。再比如iOS模拟器,可以快速验证UI布局逻辑,不需要真机也能跑通大部分代码。

我对基础薄弱的人有个建议:在模拟器上跑一遍自己写的读码,别光看书。你要在代码层面上真正改一改属性修饰符、观察delegate释放时的行为,才会对“weak为什么解决循环引用”“copy为什么用NSString”这些题目有肌肉记忆。

5.3 如何高效复盘一套笔试题

很多同学刷完一套题,对完答案就过了,这是不对的。正确复盘姿势是这样的:

  1. 把所有做错的题归类:是概念不清、审题失误、还是完全不会。
  2. 对“概念不清”的题:回到对应的知识点,用官方文档或源码补齐。
  3. 对“审题失误”的题:分析自己为什么会看错,是中了陷阱还是读题走神。
  4. 对“完全不会”的题:把它当成新知识学一遍,并找同类型的题巩固。

我当时整理了一个Excel表格,每一行记一道错题,列分别是“知识点”、“错误原因”、“正确思路”、“同类题链接”。看起来麻烦,但坚持两周就见效。笔试不像数学竞赛,它的出题套路是有规律的,错题复盘比盲目刷新题有用十倍。

6. 一些补充的方向:热词里的隐藏信号

搜索这批校招笔试相关热词时,你会发现“ios架构”、“ios混合开发方案”、“uniapp打包ios流程”、“ios开发者app证书更新”、“ios加急审核”这些词出现的频率很高。这说明什么?说明现在的iOS笔试和面试,已经不只是考语法和API了,他们还想知道你有没有“工程化思维”。

比如“ios混合开发方案”,它考察的是你对WKWebView、JavaScriptCore、JSPatch这类跨端方案的了解。虽然校招笔试不会直接考这个,但面试环节很容易被追问。再比如“ios开发者app证书更新”,它属于上架发布的必备技能,如果连“推送证书和开发证书区别”都说不清,项目经验这一栏就很吃亏。

我的建议是:在复习核心原理的同时,至少花半天时间搞懂以下内容——证书与描述文件的作用、App打包上架流程、Charles抓包原理、自动化测试工具。不需要你全部实操过,但要在简历上写“了解”而不是“精通”。

最后再分享一点个人的备考体会

我到现在还记得自己第一次做这套题时的狼狈样:多选题一错错一半,编程题最后一题连暴力解都没写完整。后来复盘才发现,问题根本不在于“题难”,而在于我一直在背API,没有真正理解Objective-C和Runtime这套底层机制。

所以我特别想提醒准备校招的同学:笔试不是终点,它是一面镜子。做错题不可怕,可怕的是对完答案就合上电脑,第二天照样不知道自己哪里薄弱。如果你能利用一套题,把内存管理、多线程、Runloop这几个核心点彻底弄懂,那这套题的价值就远超它本身的分数。

还有一个小技巧:笔试的时候别太纠结时间。很多人前20分钟紧张得手抖,结果选择题错了一片。我自己的做法是,拿到卷子先深呼吸一次,把前面5道最简单的题快速做掉,状态自然就来了。校招是一场持久战,一套笔试只是其中一小关,平常心反而发挥更好。

希望这篇拆解能帮你在准备京东2019校招笔试iOS开发工程师笔试题时少走一些弯路。后面如果你们想了解某个考点的详细原理或者面试环节的追问套路,可以继续在评论区留言,我看到会再展开细聊。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询