我的 2020 iOS BAT 面试心得:Bigo、字节、快手、伴鱼、百度、微博等
ps:后面按照自己面试的时间顺序来写,记录的面试题是我印象比较深刻的,并不一定很全,暂时先提供面试题,后面考虑给出相应的题解。
面试
我面试了大大小小的各种公司,BAT、bigo、字节、快手、伴鱼等,因为一些原因,也拒面了一些公司,拿了几家的offer。
伴鱼
伴鱼是我准备后参加的第一轮面试,有很多自己准备得不是很全,也没有完全进入面试状态,面试结果不是很好,一面就挂了。
一面
算法题:判断平衡二叉树(easy)
代码阅读题:(问输出)
引申:
如果__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是啥,为什么
下方代码会有什么问题,为什么
字节跳动
字节面了两个部门,一个是头条还有一个是抖音,字节是在我回去动了个小手术后面的,面试也不是很在状态。
头条
一面(交叉面)
首先是一组代码,问有啥代码风格不妥的地方(代码忘记了)
MRC 和 ARC 的区别
ARC有什么缺点
MRC 下 写setter方法
代码题:(1、输出什么 2、如果是在自线程中会怎么样)
你理解的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类的结构,classrot、classrwt等
- 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来获取一份详细的大厂面试资料为你的跳槽多添一份保障。
评论 (1 条评论)