个人 2020 iOS BAT面试心得:Bigo、字节、快手、伴鱼、百度、微博等

ps:后面按照本身面试的时间顺序来写,记录的面试题是我印象比较深入的,并不必定很全,暂时先提供面试题,后面考虑给出相应的题解。

面试

我面试了大大小小的各类公司,BAT、bigo、字节、快手、伴鱼等,由于一些缘由,也拒面了一些公司,拿了几家的offer。前端

伴鱼

伴鱼是我准备后参加的第一轮面试,有不少本身准备得不是很全,也没有彻底进入面试状态,面试结果不是很好,一面就挂了。web

一面

  • 算法题:判断平衡二叉树(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我面了不少次,一开始面的基础研发部门,后来给我转到了企业工具研发,中间时间拖得有点长,直接拒面了。swift

一面

  • 说下你在开发过程当中遇到过的内存泄漏
  • 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 = [c firstObject];
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方法
  • 代码题:(一、输出什么 二、若是是在自线程中会怎么样)
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来获取一份详细的大厂面试资料为你的跳槽多添一份保障。