60c303b6da72ab5fc244d442d0da2463
我的 2020 iOS 面试心得:BAT、Bigo、字节、快手、伴鱼等

iOS面经分享

前言

2019年可能是过去十年里最差的一年,却是未来十年里最好的一年。


2018年毕业,有幸去了国内一家大厂工作。2019年经历了公司的大裁员,值得庆幸的是当时没有拿我们应届毕业生“开刀”,不然刚刚转正没多久的我只能加入裁员大军寻找下一份工作,2019年,身体不是很好经常感冒发烧,工作也不是很顺心,2019很难,萌生了2020看看其他工作机会的念头。2020年开篇就是一场突如其来的疫情,很多人的生活节奏就此被打乱,在纠结了很久后还是决定看看其他的机会,毕竟,富贵险中求。思考了下,决定将自己的一些经历分享出来,希望对大家有所帮助。

面试准备

决定要去看看机会后便开始了为期将近一个月的准备工作:重新更新了下简历、复习iOS相关知识、看CS基础、刷题。值得庆幸的是自己简历投出后并没有石沉大海,获得了大大小小很多公司的青睐(可能是自己是iOS开发,且有跨平台开发经验吧),基本上国内一线、二线大厂还有很多小公司都给了我宝贵的面试机会。四月准备了一个月后,五月伊始便开始了面试:因为疫情,基本都是视频面试,我不知道是不是值得庆幸,因为视频面试我才可以一天进行四轮面试,这种高强度面试状态维持了大概近两周的时间,累吗?累,但是offer它不香嘛。


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
  • 平常有看过什么技术书籍吗
  • 有看过开源框架吗
  • 工作中遇到最难的事情后面是怎么解决的
  • 有什么想问的么

贝壳找房

贝壳找房也感觉有点迷,和面试官感觉聊很不错,问得问题都很开放,很考验功底,最后还问我你感觉你过了么。但是一面后就没有然后了。

一面

  • 自我介绍
  • 聊项目
  • GCD 看你能说些啥
  • Runtime看你能说些啥
  • 内存管理看你能说些啥
  • 几个简单的链表问题(具体忘了)
  • 有什么想问的,以及根据简历给我的一些建议(简历偏向全栈,意思是我工作时间还不是很长,需要有深度,广度相关的可以后续再考虑)

完美世界

完美的面试有点匆忙,面试的问题也很有深度,后续因为必须要去现场面试,出于安全因素考虑,没有去面下去。

一面

  • 自我介绍
  • 项目中遇到的问题,怎么解决的
  • 聊了聊OC中的内存管理
  • 一个对象什么时候会引用计数+1,什么时候引用计数-1
  • 对象A copy后生成字符串对象B AB引用计数是怎样的
  • 如果A是可变的呢
  • 关键字,readonly有了解吗
  • 修饰对象的默认关键字是啥
  • category相关,category是怎么实现的
  • category的结构
  • category中的方法会覆盖原来类的方法吗
top Created with Sketch.