我的 2020 iOS BAT面试心得:腾讯、Bigo、字节、快手、伴鱼、百度、微博等

    技术2023-07-24  82

    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怎么共享cookiexx(前司)有动态库打包么,你看过xx ipa(前司app)的结构么内联函数和普通函数的区别怎么hook一个C函数有什么想问的么

    百度

    百度问得和iOS相关的较少,CS基础相对较多。

    一面

    聊项目:主要问了项目的技术栈选择,以及项目中有哪些难点http header 和 bodyGET和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还是先ViewRunloop是怎么监听到点击事件的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方法代码题:(1、输出什么 2、如果是在自线程中会怎么样) NSLog(@"1"); dispatch_sync(^{ NSLog(@"2"); }); NSLog(@"3"); 你理解的id 以及 id 和 void *区别函数指针和指针函数的区别CALayer 和 UIView的关系苹果为什么要这么设计frame、bounds、centerlayoutIfNeeded、layoutSubViews、setNeedsDisplay区别响应者链(顺便说了下完整的手指触摸屏幕会发生什么引出了后续runloop相关问题)runloop source0 和 source1都是啥runloop和线程的关系OC 消息发送机制(提到了isa、类对象,引出下面问题) 写下类的结构isa在32为和64位的区别什么是元类为啥要这么设计 category 和 extension 的区别+load方法算法题 判断镜像二叉树

    二面

    自我介绍聊项目Weex和RN以及flutter的区别要是收到了内存警告怎么办循环引用和内存泄露Block造成循环引用的原理Runloop和Timer的关系Runloop能有很多Timer么什么是source0 和 source1Timer一定是准时的吗,为什么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、KVOOC的运行时,能做哪些事情OC的一些特性(weak的实现机制等)分类和类别isa指针super与superClassdeallocKVC以及KVOblock(类型、变量捕获等)循环引用问题 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以及DFSDP(出现概率较低)

    面试资料:

    看完文章如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

    Processed: 0.009, SQL: 9