共计 9182 个字符,预计需要花费 23 分钟才能阅读完成。
ps:后面按照自己面试的时间顺序来写,记录的面试题是我印象比较深刻的,并不一定很全,暂时先提供面试题,后面考虑给出相应的题解。
面试
我面试了大大小小的各种公司,BAT、bigo、字节、快手、伴鱼等,因为一些原因,也拒面了一些公司,拿了几家的 offer。
伴鱼
伴鱼是我准备后参加的第一轮面试,有很多自己准备得不是很全,也没有完全进入面试状态,面试结果不是很好,一面就挂了。
一面
- 算法题:判断平衡二叉树(easy)
- 代码阅读题:(问输出)
TestObject *object1 = [[TestObject alloc] init];
__block TestObject *object2 = [[TestObject alloc] init];
object1.name = @"Mike";
object2.name = @"Sean";
__block int vi = 1;
void (^handler)(NSString *) = ^(NSString *name) {
object1.name = name;
object2.name = name;
vi = 2;
}
handler(@"Lucy");
NSLog(object1.name);
NSLog(object2.name);
NSLog(@"%i", vi);
引申:
- 如果__block int vi = 1; 这句改成 int vi = 1 会怎样,为什么
-
代码中的 block 是什么 block,为什么
- weak 的实现原理
- weak 弱引用表是可变的么还是不可变的
- weak 是在什么时候置 nil 的,如果同时有很多对象对性能影响大怎么办
- UIView 和 CALayer 的关系和区别
- UIView 和 CALayer 在动画上的区别
- frame 和 bounds 在什么情况下是不相等的
- bounds x,y 一定是 0,0 么,为什么
- bounds 改成 (50, 50, width, height)会发生什么,view 本身,子 View?
58
58 我面了很多次,一开始面的基础研发部门,后来给我转到了企业工具研发,中间时间拖得有点长,直接拒面了。
一面
- 说下你在开发过程中遇到过的内存泄漏
- NSTimer 怎么处理内存泄漏
- Delegate 什么情况下会出现内存泄漏,怎么解决
- Delegate 和 Notification 的区别
-
多线程相关
- iOS 中有哪些多线程技术
- 如果有两个同步任务嵌套会怎样
- 常见的锁,为什么要加锁
- C 依赖 AB 任务执行完才能执行,你怎么设计
- 读写锁底层怎么实现
-
JavaScriptCore 相关
- 什么是 JavaScriptCore,JS 和 Native 是怎么进行通信的
- 你知道 hybrid 么,说说你平常怎么使用的(因为没怎么接触过直接说的不会)
- 后面就是聊天了,中间穿插问了下动态库和静态库的却别
二面(终面)
58 这个部门的面试就两轮,二面是群面(几个人轮流面你),第一次接触这种面试形式,压力还是有点的。
- 对我的项目表感兴趣,前面聊了不少项目的内容,问了下项目的背景,做了啥以及有哪些收益
- 了解业内性能优化是怎么做的么
- 你项目中是怎么做性能优化的
-
ReactNative 相关
- RN 的原理
- RN 和 flutter 的区别
- 你知道 RN 拆包么,RN 为什么要拆包
- JS 是单线程的是怎么和 native 多线程进行交互的(这个问题有点奇葩)
- JS 和 native 通信的数据结构是什么
- 你们公司对于线上 JSError 做了哪些事情是怎么处理的
- 你有什么想问的么
一个创业公司
这个创业公司全程都是在聊天,后面问了些和 iOS 没多大关系的问题,然后就发了口头 offer。
- 聊天:在公司中学到了啥,为啥要来北京等
- 有一个 10 个 G 的文件里面每一行都有数字,对这些数字进行排序(两种方法)
- 怎么将彩色的图片专程黑白的
- Web 渲染和 Native 渲染有什么异同点
拼多多
拼多多应该是自己面的一个相对较大的公司,面试过程中和面试官有了点小分歧,后面问我源码在哪个文件哪一行,后面问得问题也基本上是我之前没怎么接触过的。
一面
- 算法: 手写 LFU(用字典写了二十多分钟,面试官让优化只知道可以用双链表优化,但是集体没能写出来)
- 一个操作如果耗时 5s 后返回 nil,否则返回一个字符串,你怎么设计(要求手写代码)
- GCD 中常见的操作(要求写代码)
- Struct 中有一些成员变量占多少字节
- 一个 OC 对象在 iOS 中所占内存的字节数(这边和面试官争了下,我说是 iOS 中至少 16 个字节,因为内存对齐,面试官问你确定我说我确定,然后就有了后面的问题)
- 你看过 alloc 的源码么,你刚刚说的代码是在哪个文件哪一行
- dealloc 的整个过程
- NSURLSession 相关的内容(具体忘了)
- web 和 native 怎么共享 cookie
- xx(前司)有动态库打包么,你看过 xx ipa(前司 app)的结构么
- 内联函数和普通函数的区别
- 怎么 hook 一个 C 函数
- 有什么想问的么
百度
百度问得和 iOS 相关的较少,CS 基础相对较多。
一面
- 聊项目:主要问了项目的技术栈选择,以及项目中有哪些难点
- http header 和 body
- GET 和 POST 请求
- GET 请求参数一定是放在 URL 中的么
- HTTPS(TLS 是啥,怎么建立连接等)
- 动态库和静态库的区别
- +load 和 initialized 方法的区别
- +load 的调用时机
- +load 分类中的处理
- 分类的实现机制
- 分类和类别的区别
- 分类中添加属性
- 关联对象的原理
- 算法:有一个很大的整形数据,转成二进制求 1 的个数(因为前面聊比较多,只要求说了下思路)
二面
- 聊项目:自己项目偏后端,问了很多和后端相关的内容,后续问的问题也基本上要求从客户端和后端双重角度回答
- 你了解的网络协议
- HTTP 和 TCP、UDP 的联系
- HTTP 和 HTTPS 的区别
- HTTPS 的原理
- 在 HTTPS 建立连接的时候都用了哪些加密算法,为什么要这么设计
- 常见的加密算法
- 对称加密算法和非对称加密算法的区别
- 说说点击一个按钮后打开一个 web 页面从发送网络请求到页面展示都做了啥
- 为什么能通过一个 URL 就能请求到对应的资源(域名解析等)
- 如果客户端上有个按钮,点击会触发一次网络请求,在短时间内快速点击,怎么处理(从客户端以及服务端角度思考)
- 知道什么是 HTTPDNS 么
- GET 请求和 POST 的区别,POST 请求参数能放在 URL 中么为啥
- 你了解的 HTTP 请求响应状态码
- 说说为什么要设计 304 这个状态码
- Web 登录时怎么保持会话状态的
- 你知道 cookie 和 session 的区别么
- 你知道常见的网络攻击么
- 什么是中间人攻击原理,怎么预防
- 平常用过抓包工具么,说说抓包的原理
- 如果让你设计一个 HTTPS 抓包你回怎么设计
- 进程和线程的区别是啥
- 进程的通信机制
- 进程 A 和进程 B 通过管道通信的话是在同一个管道么
- 多线程容易出现的问题,怎么解决
- 死锁产生的条件以及对应的解决方案
- 自旋锁和互斥锁的却别
- 什么是虚拟内存,虚拟内存和物理内存的关系和区别
- 行间的换页算法有哪些
- LRU、LFU
- 继续问项目,为啥要做这些东西,碰到了什么难点
- 你觉得你的优势和缺点是啥
- 自己的未来规划
- 还有什么想问的么
三面
- 百度三面中主要问的和职业规划相关的内容,没有太多的参考价值,这边不再叙述
腾讯
因为一开始是在音乐的流程里,约面时间相对较晚,pcg 那边想和我先聊下,然后再做选择,于是腾讯面了腾讯音乐和 PCG 两个部门
PCG
pcg 在音乐之前面,面完一面后说一面过了,但是因为流程在音乐,所以让我选择一个流程走,我选了音乐,后来音乐挂了后没有好意思去舔回来。
一面
- 聊项目
- category 的实现原理
- weak 的实现原理
- 开发中遇到的 crash
- 怎么处理这些 crash 的,有什么好的解决方案么
- 循环引用问题,怎么解决
- NSTimer 相关,和 runLoop 的关系
- NSTimer、CADisplayLink 以及 GCD Timer 的对比
- 算法:求 N!
腾讯音乐
腾讯音乐感觉业务不是很多口,感觉面试官不知道问我什么好,一面后就没有后续了。
一面
- 前面聊项目:背景收益等
- 想看机会的原因
- RN 是这么做到和 native 通信的
- 如果让你实现 RN 的效果你会怎么设计(这个问题看你功底了)
- Native 是怎么将方法暴露出去的
- 需求中的难点,你是怎么解决的
- A 调用了 B 方法都做了什么事情
- ISA 指针
- 64 位后怎么获取 ISA 指针
- runloop、runtime 工作中有接触过嘛
- 手指触摸屏幕后系统都做了哪些事情
- 怎么监听页面的卡顿
- 怎么监听函数执行时间
- 还有什么想问的么
微博
微博有点迷,感觉面试官就是对着题库问问题,感觉自己回答还 OK,但是一面后不了了之了。
一面
- 基本上都是一些 iOS 的基础,和本文面经提到的高度重复,不再叙述。
Bigo
Bigo 整个流程推进很快,一面二面都在当天完成,但是 bigo 三面后挂了,有点迷,我猜测是因为二面的算法题没有给出最优解。
一面
-
算法(三道手写)
- 字符串转整形
- 反转链表(递归和非递归)
- 将两个有序链表合并成一个有序链表
-
iOS 基础:
- Objective- C 的内存管理
- ARC 和 MRC 的区别
- Timer 的使用,怎么避免循环引用
- autoreleasePool 的底层实现机制
- autoreleasePool 的底层数据结构,为什么要这么设计
- iOS 中常见的多线程技术
- 常见的锁,有什么区别
- 如果让你设计读写锁,你怎么设计
-
RN、flutter、weex:
- 你怎么看待这些动态化技术
- RN、flutter 以及 weex 的区别
- RN 怎么和 native 通信的
- 后面简单聊了下未来的规划
二面
- 算法: 山脉数组找目标值(要求 logN 的时间复杂度)
- QA 发现了一个按钮无法响应点击事件,可能是什么原因导致的(说了五种情况好像没有答到面试官要的点)
- iOS 响应者链,怎么寻找最合适的响应者,如果为 nil 会怎么办
- frame 和 bounds 的区别
- 如果 bounds 的 origin 不是 00 会怎样
- 你平常用过 Charles 么,说说 Charles 的抓包原理
- Charles 能抓 HTTPS 么,怎么实现
- HTTPS 怎么建立连接的
- 中间人攻击,怎么避免
- 多线程一般会有什么问题,请举个例子
- 为什么会造成上述问题以及解决方案
- 主队列和主线程的关系
- 全局并发队列一定在主线程上运行的么
- 项目相关,用了什么技术,有哪些难点,怎么处理的
三面
- 自我介绍
- 为啥想看机会
- 聊了下项目
- 怎么看待 RN、Flutter
- 平常有看过什么技术书籍吗
- 有看过开源框架吗
- 工作中遇到最难的事情后面是怎么解决的
- 有什么想问的么
看完文章如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群 1012951431 来获取一份详细的大厂面试资料为你的跳槽多添一份保障。
贝壳找房
贝壳找房也感觉有点迷,和面试官感觉聊很不错,问得问题都很开放,很考验功底,最后还问我你感觉你过了么。但是一面后就没有然后了。
一面
- 自我介绍
- 聊项目
- GCD 看你能说些啥
- Runtime 看你能说些啥
- 内存管理看你能说些啥
- 几个简单的链表问题(具体忘了)
- 有什么想问的,以及根据简历给我的一些建议(简历偏向全栈,意思是我工作时间还不是很长,需要有深度,广度相关的可以后续再考虑)
完美世界
完美的面试有点匆忙,面试的问题也很有深度,后续因为必须要去现场面试,出于安全因素考虑,没有去面下去。
一面
- 自我介绍
- 项目中遇到的问题,怎么解决的
- 聊了聊 OC 中的内存管理
- 一个对象什么时候会引用计数 +1,什么时候引用计数 -1
- 对象 A copy 后生成字符串对象 B AB 引用计数是怎样的
- 如果 A 是可变的呢
- 关键字,readonly 有了解吗
- 修饰对象的默认关键字是啥
- category 相关,category 是怎么实现的
- category 的结构
- category 中的方法会覆盖原来类的方法吗
- category 中怎么区分开类方法和实例方法的
- category 的方法是怎么插入到类 (元类) 对象方法列表中的
- 同时最多执行 5 个任务怎么设计
- AFN 中 success 和 fail block 是在子线程还是主线程
- 不通过回到主队列的方式回到主线程(有点没 get 到点)
- SDWebImage 的下载原理
- 如果有两个相同的 url,SDWebImage 是怎么处理的
- 算法:有个 view 有很多子 view,没个子 view 中也有很多子 view,找出所有的按钮,并切圆角(图的 BFS)
滴滴
滴滴效率是真的高,面试流程一晚上走完,当晚出结果,从面试到发 offer 仅仅用了 4 天左右的时间。
一面 to 终面
- 主要涉及 iOS(runtime、runloop、内存管理等)
- 计算机网络(HTTP、HTTPS、TCP/UDP 等)
- 操作系统(进程线程、进程通信、中断的一些机制以及一些换页算法等)
- 算法基础(常见的一些链表、树以及数组算法题)
ps:面试题之前均有涉及,不再详写
猿辅导
猿辅导面试还是有点难度的,算法写完还要跑 case,第二道题目跑 case 不正确,看代码 debug,后面因为时间不够没有给出正确结果,后面就没有后续了。
一面
- 聊项目(主要是项目中的一些技术点)
- 聊对大前端的看法(weex、RN、Flutter 对比等)
- JS 是怎么实现继承的,什么是 JS 的原型链
- iOS 内存管理(引用计数、修饰词、weak 和 assign 的区别)
- runtime(什么是 runtime,为啥要有 runtime,你用 runtime 做过什么事情)
- 怎么进行方法的交换
- +load 在什么时候调用的,对启动的影响
- 代码题:ABCDE 五个任务,D 依赖 AB 的执行,E 依赖 BC 的执行,怎么设计
- GCD 信号量,线程同步等
- Runloop 是啥,为啥要设计 runloop,runloop 和线程的关系
- Timmer 为啥会有内存泄漏的现象,Runloop 会持有 Timmer 么
- 什么是 source0 和 source1,分别做什么事情
- 怎么监测 app 卡顿
- UIView 和 CALayer 的区别,为什么要这么设计
- 隐式动画和显示动画的区别
-
算法:两题 LC medium(都要求写完跑 case)
- 给定一个数字 n 求出全部集合(n = 3 输出 [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]])
- Lc 200 求岛屿个数
高德
这边有个小插曲,因为之前高强度的面试,后面拿了几个不错的 offer 后就不太想继续面了,感觉面试状态也是一个正态分布的曲线,拒了高德面试后 hr 找我聊了下,然后又答应继续面试,后面因为自己确实没有发挥出正常的水平,导致一面挂了,不过 hr 后来请我喝了杯咖啡还是蛮开心的。
一面
- 聊项目
- JS 是怎么和 Native 通信的
- 模块表是怎么生成的
- JS 函数注入怎么做的
- RN 和 Weex 的区别
- HTTP 请求头
- HTTP 状态码
- 分类和 extension 区别
- 分类的实现机制
- 分类同名方法的调用
- 关联对象,策略有哪些,关联对象的 key 为啥要用 static 修饰(这个没有 get 到点)
- GCD、NSThread 以及 NSOperation 的区别,怎么取消任务
- GCD block 内存管理
- 自己实现一个函数,其中有个形参是 block,这个 block 是什么时候进行 copy 的,一定会进行 copy 操作嘛
- 手指点在高德地图上的一个按钮,会发生什么,具体说明
- 怎么找到最合适的 view
- 如过有多个子 VC,是先 VC 还是先 View
- Runloop 是怎么监听到点击事件的
- Runloop 和线程的关系,Runloop 能单独存在嘛
- 怎么做到线程保活
- A 包含 B 包含 C,怎么做才能让 C 的点击响应区域是 以 C 对角线为半径的圆弧(要说出具体实现方式)
-
代码题:
- 下方代码中三个数组中的 p.name 是啥,为什么
Person *p = [[Person alloc] init];
p.name = @"zhangsan";
NSArray *a = @[p];
NSArray *b = [a copy];
NSArray *c = [a mutableCopy];
Person *p2 = ;
p2.name = @"lisi";
- 下方代码会有什么问题,为什么
NSNotificationCenter *__weak center = [NSNotificationCenter defaultCenter];
id __block token = [center addObserver:kDdiRegisterNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {[self getDataWithComplete:completeBlock];
[center removeObserver:token];
}];
字节跳动
字节面了两个部门,一个是头条还有一个是抖音,字节是在我回去动了个小手术后面的,面试也不是很在状态。
头条
一面(交叉面)
- 首先是一组代码,问有啥代码风格不妥的地方(代码忘记了)
- MRC 和 ARC 的区别
- ARC 有什么缺点
- MRC 下 写 setter 方法
- 代码题:(1、输出什么 2、如果是在自线程中会怎么样)
NSLog(@"1");
dispatch_sync(^{NSLog(@"2");
});
NSLog(@"3");
- 你理解的 id 以及 id 和 void * 区别
- 函数指针和指针函数的区别
- CALayer 和 UIView 的关系
- 苹果为什么要这么设计
- frame、bounds、center
- layoutIfNeeded、layoutSubViews、setNeedsDisplay 区别
- 响应者链(顺便说了下完整的手指触摸屏幕会发生什么引出了后续 runloop 相关问题)
- runloop source0 和 source1 都是啥
- runloop 和线程的关系
-
OC 消息发送机制(提到了 isa、类对象,引出下面问题)
- 写下类的结构
- isa 在 32 为和 64 位的区别
- 什么是元类为啥要这么设计
- category 和 extension 的区别
- +load 方法
- 算法题 判断镜像二叉树
二面
- 自我介绍
- 聊项目
- Weex 和 RN 以及 flutter 的区别
- 要是收到了内存警告怎么办
- 循环引用和内存泄露
- Block 造成循环引用的原理
- Runloop 和 Timer 的关系
- Runloop 能有很多 Timer 么
- 什么是 source0 和 source1
- Timer 一定是准时的吗,为什么
- FPS 怎么监控,上传时机
- 算法:两数之和(要求空间复杂度 O(1))
抖音
抖音面试有点迷,感觉面试官和我完全在两个频道,面试官问的内容我明明回答了但是他恕我啥都不会,不知道是不是没有 get 到他的点。
一面
- 聊项目
- iOS 中 +load 和 initialized 区别
- iOS 修饰属性常用的修饰符
- weak 和 strong 的区别
- strong 和 unsafe_unretained 区别
- 什么是单例
- 对象的比较
- 算法:开根号(要求跑 case)
快手
快手也是在我动完小手术后面的,我感觉面试发挥正常,和面试官聊也不错,但是玄学的是自己还是挂了,后面有其他 BG 想捞也不想面了。
一面
- 自我介绍
- 在学校都做了哪些项目
- 聊公司项目
- 常见的 crash
- 怎么处理这些 crash
- 怎么设计一个 crash 日志回捞系统
- Objc 为啥要设计消息发送机制,直接调函数不好吗
- 怎么获取函数的堆栈
- 怎么监控 APP 卡顿
- APP 启动做了哪些事情怎么优化
- +load
- 怎么进行业务解耦
- APP 性能优化相关
-
设计一个下载任务
- 可以并行也可以串行
- 有最大的并发数量
- 可以断点续传
- 如何解耦
- 缓存怎么设计(说了 LRU、LFU)
• 微信底部四个 tab 包含首页让你实现要多久,为什么(这个真的没有明白是想问啥)
• 算法:链表反转
总结
一天四轮的面试确实是高强度的,一天下来整个人会很疲惫,导致前面拿到了一些 offer 后,紧绷的弦马上就松懈下来了,后面几轮高德、字节以及快手的面试都没有发挥出自己应有的水平,所幸的是整体结果差强人意。面试需要不断复盘总结,不至于这次面试问的问题不懂下次还不懂,还有知识需要不断积累,不能再临时抱佛脚了。
简历
简历决定着你能否有面试机会,一份好的简历可以让你事半功倍。
- 可以去网上找一份简历模板
- 简历尽量精简,最好能控制在一页 A4 纸
- 要做一些取舍,校园经历尽量不要写了
- 描述项目建议用 STAR 法则(说清楚项目背景、目标、做了哪些事情取得了哪些成果)
- 自己不是很熟的东西就不要写了,感觉只要写到简历上面试官就默认你精通
iOS 相关
iOS 有很多东西我们是看不到具体的实现的,毕竟是闭源的,但是我们能结合我们的一些经验去猜测苹果的一些实现方式。目前 iOS 面试问的问题越来越细,越来越底层,所以阅读一些源码是及其有必要的,iOS 一般常考的点如下(这边列举得可能并不是很全):
-
Objective- C 语言相关
- OC 的内存管理(ARC、MRC、autoReleasePool 等)
- OC 类的结构,class_ro_t、class_rw_t 等
- OC 的消息机制
- KVC、KVO
- OC 的运行时,能做哪些事情
- OC 的一些特性(weak 的实现机制等)
- 分类和类别
- isa 指针
- super 与 superClass
- dealloc
- KVC 以及 KVO
- block(类型、变量捕获等)
- 循环引用问题
-
swift 相关:
- 笔者没怎么接触过 swift 这边就不写了
-
iOS 相关
- UIView 和 CALayer 的区别
- CoreAnimation
- 多线程(GCD、NSOperationQueue)
- runLoop 以及 runLoop 的实现原理
- 响应者链
- Timer(NSTimer、CADisplayLink 以及 GCD Timer)
- iOS 渲染的知识
动态化技术(加分项)
- 怎么看待这些技术
- 需要了解下 ReactNative、Flutter 以及 Weex 等主流动态化技术的优缺点
- 根据实际情况了解下 ReactNative 或 Flutter 等动态化技术的实现原理
- 了解下 JavaScriptCore,知道和 native 的通信机制
CS 基础
这部分主要看你基础是不是扎实了,作为一名 RD,不管做什么,这些知识都是要掌握的。
操作系统
- 进程和线程
- 进程通信
- 虚拟内存和物理内存
- 常见的调度、换页算法
- 中断机制等
计算机网络
- OSI 七层模型
- 常见的协议(HTTP、HTTPS、TCP、UDP)
- HTTP 报文格式
- GET、POST 却别
- HTTP 状态码
- HTTP 和 HTTPS 的区别
- HTTPS 的连接建立机制
- TCP 三次握手以及四次挥手,为什么要三次握手,四次挥手少一次会怎样
- TCP 和 UDP 区别
- TCP 的一些安全机制(用塞控制,较验和等)
- 域名解析等
编译原理
- 编译的过程
- 怎么进行一些优化等
算法(脱离编译器手写,最好能肉眼 debug)
算法基本上是工程师面试必定考察的点,现在越来越多的公司面试考察算法,作为 iOS 开发的同学,在面试之前至少要刷下《剑指 offer》上的所有题目,这本书上的题目都是经典中的经典,面试出现概率极高。有时间的话可以刷下 LeetCode 上 easy 和 medium 难度的题,iOS 面试,很少有考察 hard 的题目,但是就算是遇到 hard 的题目也不要过于紧张,仔细审题,寻找突破口。算法是一个积累的过程,现在 LeetCode 可以每日打卡,这是一个很好的积累手段。下面罗列下常考的数据结构和算法:
-
数据结构
- 数组
- 链表
- 树
-
算法
- 二分(就本人经验来看出现概率极高)
- 分治
- 排序(8 大排序)
- 树的遍历(前、中,后)
- BFS 以及 DFS
- DP(出现概率较低)
面试资料:
看完文章如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群 1012951431 来获取一份详细的大厂面试资料为你的跳槽多添一份保障。