前言
整个面试从四月底,到现在,面试的经历,总共只有 卓牛科技 是去了公司,其他都是线上面试.
读本文你能得到什么 --->实战的面试题,心态变化,准备要点
面试的公司:
欢聚时代,卓牛科技,汇丰银行,荔枝FM,腾讯视频,
地点:广州
面试流程
1.欢聚时代YY:
首先第一家面试是YY,当时是应聘的直播框架的技术支持,HR说YY把成熟的直播技术做成SDK,方便其他公司使用,如果集成遇到了技术问题,这个岗位就是为了解决这个问题.
当时是一个做直播相关的组长面试我的,面试时间是2020-04-23-8:00pm,那是今年的第一次面试,之前没有笔试,还没有什么面试状态,
印象比较深的几个面试题:
(1)静态库 动态库的区别:
我的前一篇文章有讲到 静态库介绍
(2)tcp的三次握手:为什么是三次,不是两次,四次?
第一次:客户端发送syn包,
第二次:服务端收到syn + 1,再送回给客户端
第三次:客户端发送请求,告诉服务端收到服务端的返回数据,
最后一次,可以看出,客户端必须回应服务端,我已经收到了你的数据,最少要三次,这样能保证可以建立可靠的连接,如果再增加一次,也只是提高连接的稳定,其实作用也不太大.
(3)你对未来的几年是怎样规划的
我当时答的是想学JAVA,脚本,最后当架构师,这个的确是我当时的想法,因为当时掌握完OC底层的东西,学东西在一个上升期,什么都有兴趣.
面试官大致意思:应该把手头的知识学透,往深了学,iOS学透了,专注一门技术,不同语言的底层逻辑都是大同小异,学原理,别在意那些语法糖,做个
T
型人才,他语言表达比我好,后来这话我还真听进去了...下决心往深了学,才有的这一系列文章.
小结:
这次面试我发挥的不太好,这两个问题没答全;最后面试官问你 ,还有没有什么想问我的,一个万金油式的回答--->我想问下,您觉得我今天的面试表现怎么样,能不能给我一些建议,面试官还挺好的,给我指出哪些不足的问题,没有说一些官方的话,给的建议都一针见血,
精选全网 · iOS面试题答案PDF文集
- 最新 初级iOS 面试题
- 最新 中级iOS 面试题
- 最新 高级iOS 面试题
- 《BAT面试资料全集》
- 《BAT大厂常问iOS面试题》
- 《2021年面试真题》
- 《iOS中级到高级面试题完整版》
- 字节跳动,京东,小米,腾讯、头条、阿里、美团等公司21年的面试真题
资料下载地址:
2.卓牛科技
当时去的时候是在天河区华强路9号,上楼惠康码+身份证,刷身份证上楼,当时回来的时候还把身份证搞丢了;
这个公司大概40人左后,地方不大,在等候区待了二十来分钟,给了一套笔试题,做完人事把我带到公司中间的会议室,
笔试题还记得两道:
具体记不得,大概意思就是问你会出现什么问题,显然是会释放两次,出现BAD_ACCESS_XXX的野指针错误
autoreleasePool{
[person release]
autoreleasePool{
[person release]
}
}
frame bounds 区别,frame相对于父控件,bounds相对自身
面试我的应该也是一个小组长,瘦瘦的,173左右,戴N95白口罩,过程中有点广西口音,曾经一度听不清他在问的问题,面试时间是2020-05-15-10:30am
面试题
(1)单例:我当时回答用GCD的dispatch_once,它说不会有线程问题吗,当时把我问懵逼了,心里想一直是这么用的啊,没发现问题,难道是要加锁???,然后我就回答了个@synchronized
,它说有没有其他方法,我一直没get到他的点,他提示我是语言层面的,我想了一下,我说不知道,能不能请教一下,他说static
,我其实有点懵,单例不是就这么写么...
(2)MVVM,简要说下VM有什么作用,我回答的是,作为M 和 V 的桥梁,减少VC的体积,把组建数据,发送请求,请求返回处理数据,及数据源的方法都搬到VM,逻辑结构更为清晰,
他说: 还有呢, 还有呢... 我想不到了,
请教一下:他回答四个关键字,解耦,XX,XX,XX,后面几个不记得了,我感觉我说的也是差不多的意思,可能让他觉得没有答到他想听的关键字,
整个面试感觉交流有点障碍,我不知道他想问的点在哪,说我缺乏面试经验,也确实是面试不多,整个面试没有面到特别有共鸣的时候,感觉体验不是太好,当时的面试心态其实挺放松,到真正聊的时候完全不紧张,甚至还有点嚣张,自己的原因的话就是知识的提取速度慢,没有很清晰的理解面试官想问的问题.
3.汇丰银行
汇丰银行是一家外企,有一定的英语口语要求,面试要英文自我介绍,当时是急着招人,委托了几家外包公司招人,软通动力,法本,记得当时软通动力的好几个人事给我发消息,面试流程就是,外包公司的技术面试我,面试完之后还跟面试官聊起来了,因为当时问的问题都很常见,所以还算比较聊得来,
有个小插曲,软通动力本来和我定的时间是2020-06-17-06:30pm
,后来改到六点,我急急忙忙下班等着,那边一直没上线,等了半小时,就退了,后来当时就约了法本的技术面试,过了之后给了我一套题,说是汇丰里面的技术会问到的问题,
面试的时候又出现乌龙,让我下载ZOOM这个APP,然后当时进去,半天听不到声音,调了好久,进进退退,最后调好,聊了五分钟,加了微信,才发现他也是来面试的...
最后没面上,整个面试体验不好,外包公司有个菇凉会及时通知你,一路给你服务,和你沟通面试时间,那两家外包公司好像是竞争关系,她跟我说,一定要来我们公司之类的话,应该是面试进一个她们会有分成,最后面试的汇丰里面的会给你一些专业词汇,用英语说的,singleton....类似这些,因为我不会swift,当时他们项目用swift开发,所以没匹配上
薪资的话他们招聘的时候给的还挺高的20k-40k,有点让我感兴趣的是汇丰的办公地点 和 能够锻炼英语,公司的位置就在太古汇附近,离我住的地方算近的,但是也没觉得可惜,当做一次面试经验.
4.荔枝FM
我之前在拉钩往上看过荔枝的介绍视频,公司体量挺大的,有自己的食堂,氛围看着也还不错,给出的薪资也比较中肯,我面试的时间是2020-06-22-03:15pm
当时面试官开会,所以延后了15分钟,人事也提前给我打电话说明,公司的流程方面还是挺细心的,面试前会给你几个笔试题做,下面是我还记得的几道笔试题,没记错的话,整个笔试时间是40min
0.NSString 为什么用copy
当时我就说了copy 和 mutableCopy的区别,一个是地址拷贝,一个是值拷贝,这个题我也看到过,
所以又举例 如果NSMutableArray 用copy的话创建出来的最终会是__ArrayI类型,
就是不可变的,如果你再用这个数组调用addObject:就会出现方法找不到的错,
因为它本质是NSArray,不是NSMutableArray
1.UIView 和 CALayer 的区别,举例CALayer的妙用
简单说了下CALayer不能响应事件,用于动画,背景颜色显示,UIView可以响应,妙用就是一些动画方面.
2.以下代码的作用是什么? 变量age被定义为NSInteger,它编译时没有问题【告警忽略】……但为什么会crash?
UILabel *mylabel=[UILabel new];
mylabel.text=age?[NSString stringWithFormat:@"%@",age]:@"";
这个题我在笔试之前曾经搜过他家公司的笔试题,我知道不会崩,当时我看着age没有指定类型,
分别以NSInteger 和 NSString做的说明,
3.给定一个区间 {[]},传入一个值 a,返回一个区间,
比如 {[ ]},a = 1--> {[1 1]},
{[1 3]} a = 2 --> {[1 3]}
{[1 4] ,[6 8]} a = 5-->{[1 8]}
大概是这个意思,我当时写的是伪代码,
考虑一般情况
{[x1 y1],[x2 y2],...,[xn yn]} ,给定 a
if(a < x1){
{[a a],[x1 y1],[x2 y2],...,[xn yn] }
}else if( a > yn){
{[x1 y1],[x2 y2],...,[xn yn] ,[a a]}
}else{
这判断 a 是否包含在某个区间内,或者 能够合并两个相邻区间,
我的思路是 把 arrayX = [x1 ,x2,...,xn]数组用二分法找到最近一个小于a的x,
判断是否在当前区间内,或者 在两个区间之间,
}
4. 举个例子说明你在项目中用到比较复杂/厉害/牛逼的技术,你是怎么从发现问题,定位,
解决的整个过程(题意大概是这个意思),
我当时举了个例子,半真半假吧,项目的确遇到过那个问题,把最近看的MJRefresh里用msg_send()的那个宏,
有兴趣的可以看看[这篇文章](https://www.jianshu.com/p/fed5bb2d6eb6)
我当时答的是手机银行调用蓝牙盾崩在了里面,因为有些方法没有暴露出来,用这个技术定位并重现了这个问题,
确定是SDK的问题,最后让他们修改的
MJRefresh里用msg_send()的那个宏,有兴趣的可以看看这篇文章
星期天笔试完,周一下午安排的面试,面试大概持续了一个小时,他们公司的面试题会认真看(YY的面试题似乎没有看,我记得我YY的面试题做的很烂,下面一会儿会讲到),面试开始,他说:那咱们就从面试题开始吧,
(1)拿着那个NSString为什么用copy的题又问了一遍,我当时在想,是不是笔试题没有回答对,然后我又答了一些,[xxxx mutableCopy]返回的是可变对象,[xxx copy]返回的是不可变对象,它似乎不怎么满意,就一直追着问(这个面试官的特点就是从一个小的点展开,他不会很明显的考察哪个知识点,他是通过不断深入问一些应用场景的题目,看你的掌握深度 和 解决问题的能力,这几场面试,荔枝是最累的),后来我说不太清楚了,能不能请教一下,他说的意思我大致用代码来说明:
@interface ViewController ()
@property(nonatomic,copy)NSString *name;
@property(nonatomic,strong)NSString *name1;
@end
- (void)viewDidLoad{
[super viewDidLoad];
NSMutableString *strM = [NSMutableString stringWithString:@"this is a sentence"];
self.name = strM;
self.name1 = strM;
strM.string = @"abc";
NSLog(@"%@ - %@",self.name,self.name1);
打印结果:
this is a sentence - abc
所以结论是,如果你用copy ,strM改变之后不会影响原来的值,如果用strong,
那么指针会指向那个 strM,会跟着改变,
当时没有细想,我觉得这种说法有待商榷,如果我的需求就是想跟着改变呢,所以我觉得NSString用copy修饰就是一个假命题,因为这个要看你的业务场景,不是不用copy就是错.
这里说明下:当你不知道问题答案的时候,你可以直接问面试官,因为你面试就是查漏补缺,搞懂你不会的知识点,其次面试官也会觉得你是个好学的人,有的面试官都是很愿意分享的,他们也有倾诉欲,也有可能这个知识点也会,只是题目你没理解清楚,他提点一下你就想起来也说不定,所以;不懂的,一定要问,就算面试不过,我也得从面试官口中撬出些有用的东西.
(2)后来聊到NSTime的使用会造成内存泄漏的问题,他说你在使用timer的时候会传入什么值, 我回答 self ,@selector,又问:你在什么时候释放timer,我说:在你明确的业务场景下,不用timer了,[self.timer invalidate];self.timer = nil;
一般在dealloc,现在这种情况会出现相互强引用的情况,控制器肯定释放不了,走不到dealloc,它又问怎么办,我想了一下在viewWillDisappear里面操作,当前控制器pop ,push新控制器的时候再来做判断,然后销毁timer,又问: viewWillDisappear方法是在pop,的时候调用还是在push的时候调用,我回答都会调用,又问:那你怎么区分,我想了想,回答说,看self.navigationController.viewControllers是增了还是减了,又问:你每个控制器都这么搞吗,我又提供了一些想法,当初绑定weakSelf,
self.timer = [NSTimer timerWithTimeInterval:1 target:weakself selector:@selector(testString) userInfo:nil repeats:YES];
或者全局搞一个BOOL flag,在timer的方法里判断之后再干掉timer,又问:那timer的方法只调一次吗? 我回答说用flag判断了啊,他又问:你这个self.navigationController.viewControllers数量增加只能在下一个界面拿到.
那我说我不太清楚了,可以请教一下吗?
他大概是这个意思
@interface ViewController ()
@property(nonatomic,strong)NSTimer *timer;
@property(nonatomic,weak)MJPerson *person;
@end
- (void)testVc{
XXX
}
- (void)viewDidLoad{
[super viewDidLoad];
self.timer = [NSTimer timerWithTimeInterval:1 target:self.person selector:@selector(testPerson) userInfo:nil repeats:YES];
}
给timer绑定一个weak修饰的属性,用这个属性的testPerson方法,调回控制器的testVc方法,
我当初说好吧,理解了,
我后来回头想想,好气哦,感觉自己吵架没发挥好,他这个方法还不如我的,"你难道每创建一个timer都搞一个类来绑定吗?,还再调回到当前控制器,你是要搞一个block,还是代理,真麻烦..."
这是我当初的逻辑
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"ViewController";
self.timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(testTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}
- (void)testTimer{
NSLog(@"%s",__func__);
}
- (void)dealloc{
NSLog(@"%s",__func__);
}
- (IBAction)pushToNext:(UIButton *)sender {
ViewControllerAfter *afterVc = [[ViewControllerAfter alloc]init];
afterVc.view.backgroundColor = [UIColor whiteColor];//不设置颜色就会卡一下,而且push出来的控制器是黑的
__weak typeof(self)weakSelf = self;
afterVc.keepTimerAliveBlock = ^(BOOL isKeep) {
if(isKeep) [weakSelf killTimer];
};
[self.navigationController pushViewController:afterVc animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
如果要特殊处理,可以创建一个BOOL值用在这里做标识
[self.timer invalidate];
self.timer = nil;
}
- (void)killTimer{
[self.timer invalidate];
self.timer = nil;
NSLog(@"%s",__func__);
}
(3)我说我最近读了MJExtension 和 MJRefresh,他让我说说原理,他说那个动画你是怎么实现的,我说用layer做的动画,他给了个实际应用场景,举例说:假如有一个动画是,一个箭头一开始指向十二点的位置,随着scrollView的拖动,顺时针旋转,拉到临界值,就指向六点的位置,你会怎么做,如果我向上再滑动80% ,在拉回20%,你的动画怎么做,我说传入一个初始值,最终值,做动画,这组问题是问的最久的,动画我不太熟悉,这题没答好,
最后我问他 ,觉得我面试怎么样,他说:整体还可以,有些地方基础有点薄弱;说通过的话,人事明天会给你联系,如果没有,就是没有过,这点倒是挺明确的,当然后来没收到人事电话,我整体说说这次面试的感受吧,
整体的感受就是,他不单纯的考察你某一个技术点,不是问一些原理性的东西,他的每个知识点都是融入在每个应用场景当中,如果你没有很好的开发经验,面试起来是比较吃力的,他会一直追着往下问,直到你回答不出来 或者 给出完美答案为止,这个还是蛮锻炼人的.
5.欢聚时代YY:
是的,你没有看错,我又得到了一次YY的面试机会,当时YY的人事给我打电话,我自己也有点懵,她说;在我们的人才库里发现你的简历,想跟您邀约一下面试,其实在面试荔枝FM之前 前两面都已经过了,在写这篇文章的时候,三面技术都过了,就剩下今天下午的人事面试了,
YY的面试分为五轮:一轮笔试,三轮技术,一轮人事,
笔试题我真的做的很烂....
1.链表反转
2.UIView 和 layer 的区别
3.假如有一个楼道,有A阶楼梯,你每次可以走B阶,或者C阶,B,C都有可能大于A,问:一共有多少种走法,
4.最后一个题也挺经典的,我忘记了,记起来再补充
5...
他们应该没怎么看面试题,或者说参考度不是很大,不然我应该没有后续的面试机会,除了链表的曾经做过,笔试的时候死活记不起来...,后面三道题,我感觉都挺难的.
一面:
一面问了一些常规的问题,说说数组和链表的区别;我当时脑袋记串了,把hash表的一通说;我当时是这么说的,我说数组的存取都是O(1),因为数组 hash出来的值直接存到某个位置了,而链表只能添加末尾,数组的内存是连续的,链表是不连续的,链表的取是O(1)的,后来他说,数组的插入效率是很低的,因为所有的后面元素都要往后挪,我才醒悟过来,我又不能说我知道,只是记混了...
判断回文串,一个字符串,从正面和反面读,都是一样的,比如 12321,abcba,面试官还给我解释了一遍,人家还是挺不错的,我当时想了想,没好的解法,我说不太会,他说,没事儿,你再想想,我就开始挤墨水,说搞两个指针,一个指向开头,一个指向末尾,向中间靠拢,分别对比,不同就返回false,直到两个指针相遇,他说;嗯 ,暴力破解,面试结束后我又想到一个,有些语言中有reverse()函数,比如swift,可以将字符串反转,再比较相等,还可以复制一个字符串,将其中一个字符串入栈,再stack.pop()跟原来的对比,其他的问题 我就不太记得了,主要是这两个问题卡壳.
我当初问面试官,您觉得我面试怎么样,能不能给些建议,他说;挺好的,说是跟人事商量下,我以为是客套,因为这两个问题是硬伤,
二面
二面就聊得很对路,有一个小的算法题,怎么找出数组中的第二大的数,
我当初就回答了,遍历两次,暴力破解,第二个是请教他,告诉我的,他刚一提到用两个变量,我就想到了,max ,max1,每当max更新之前,就把max1 = max;这样一次遍历就能找到;
当时他就直说的,说觉得技术还不错,所以当时心里就有底了,会有第三面,当时他说,三面会有leader,我问他要不要什么特殊准备,他也给了我一些建议;二面当天是星期五,HR问我下次面试定在什么时候,我说下周二,当时是想着能够多一天准备,稳一点,后来觉得还挺冒险的,万一有人比我先选上呢,同时战线拉得太长,自己会很疲.
三面
第三面的时候心态就有些变化,开始有得失心,前面两面心态都很平静,不是很在乎,尽力就好,就以前面试都不会紧张,就平等交流,我觉得个人与公司是个双向选择的过程,不是因为你公司牛逼就非去不可;
到面试前中午午睡都睡的不是太好,因为是leader面,可能是前两面有点顺,怕阴沟里翻船,我特意刷了些排序算法,还有那种考验动手能力的,设计模式,当时二面跟我说的,
三面的第一个问题就是你项目做的比较闪光的点,聊聊这个,
关于这个问题面试都会遇到,变式1:你有没有在项目中遇到比较难解决的问题,最后是怎么解决的,,变式2:你在平时学习中学到的技术点,有没有在项目中用过...
面试官问这个有几层意思,想看看你的技术深度,或者想找一些切入点来展开,引申出一些其他的问题,
我接触的项目很难了解到最底层的东西,跟着项目聊了二十分钟左右,,没有说出具体的加密算法,和工程里面有亮点的地方,我心里觉得可能要出事,然后我就跟面试官交流,我说聊自己的项目的话,不能完全体现我的能力,咱们可不可以聊一些其他的,比如说第三方,OC底层,源码阅读...后来这个就成了面试的转折点,有种起死回生的感觉,最后勉强达到及格线,没有再卡壳的问题.
端午的前一天,接受了HR的面试,HR面试的目的就是考察一些点,比如,你的基本资料是否真实,你的生活习惯,学习能力怎么样,你的成长环境,当时HR问了我的大学生活,做了什么值得骄傲的事儿,我说,做过文学工作室的主任,编辑过几本杂志,因为我是在民族学校上的学,还问了一些民族学生的相同和不同点,然后就是问平时生活中怎么提升工作能力的,你的学习渠道是哪些,我回答的是阅读开源框架,撰写博客,关注一些bilibi的程序员博主,再有就是买一些行业内的书籍阅读,最新的技术,比如所AI,云计算等等,聊了大概40min,HR说会后续跟进;我以为到HR这关基本上就算是已经过了,但是现在还是没收到offer,心里有些忐忑,我猜想可能他们手里拿了几个名额,要比对一个性价比最好,或者说最有潜力的人来担任这份工作,所以接下来还是积极准备面试吧...--->已拿到offer
6.腾讯视频:
腾讯面试的时间恰好是刚面完YY人事之后,高强度的面试真的耗精力;
腾讯的面试岗位是深圳的,面试时间差不多一个小时,面试内容前部分主要集中在自己做的项目内展开,因为我本身是做手机银行业务的,在这一块其实感觉没什么可挖掘的点,因为银行的核心业务代码不会让每个开发人员看的到,一些银行的加密算法和具体的流程都封装在SDK内部,而且有专门负责安全的安全组来做加密控件,我们只是调用,和封装逻辑代码,没有太大的技术含量,所以感觉还是蛮吃亏的,可供提炼的点有点少.
这次面试比较有价值的一个题目是:
我们将整数x的权重定义为按照下述规则将x变成1所需要的步数:
如果x是偶数,那么x = x / 2;如果x是奇数,那么x = 3 * x + 1
比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。
给你三个整数lo,hi 和k。你的任务是将区间[lo, hi]之间的整数按照它们的权重升序排序,如果大于等于 2 个整数有相同的权重,那么按照数字自身的数值升序排序。请你返回区间[lo, hi]之间的整数按权重排序后的第k个数。【LeetCode 1387】
当时我给出的解法--也是最容易想到的解法,暴力破解,先算出所有的权重,排序,再给出第k个数.
面试感受
整个面试阶段,大概面试了六七家,目前还没拿到offer,写这篇文章的目的是总结自己的面试经历,也分享给大家,从这几次面试,得到一些比较有用的点.
- 一定要提炼自己工程上的技术要点,因为面试官是拿着你的简历在面试,切入点也是你的项目工程,即使你觉得工程中用到的技术点都没什么可说的,你也得找出几个闪光点,我在这个点上吃了亏,没有很好的展示出自己的技术栈,YY第三面的时候差点栽在这里,所以以后的面试得认真的分析一下自己的项目内容,准备两到三个可以长时间对话的面试内容.
- 大厂的算法题没有我想象的难度那么高,我之前觉着可能会问到红黑树,二叉树的具体操作,因为我简历上写的是熟悉基本的数据结构和算法,面试者几家都是比较常见的算法题,所以算法的准备其实可以偏向于一些智力类型的题,这个其实是考察你解决问题的能力,也许你没刷到过这个题,但是你也可以给出一些暴力破解的方法,可能深入的那些算法题是给那些资深工程师 或者 架构师水平的人准备的,在这方面可以有些侧重点.
- 平时开发中遇到的问题,尽量做出记录,因为在面试的时候这种问题最常见,考察的也是你解决问题的能力,虽然我觉得开发中遇到的bug,90%是因为你的粗心,剩下的就是你的知识储备不够,API不熟悉,导致的,但是在面试的时候是比较注重你这方面的能力,解决问题的能力.
- 因为每个人的侧重点不同,接触的项目也不同,尽量引导面试官,把面试内容引导到你所熟知的点,比如你擅长性能优化,你在回答问题的时候就可以多提这种关键词,面试的时候经常出现的场景就是,"你刚提到XXX,那你说一说XXX是怎么实现的,如果让你来做你会怎么样...",把问题引导你熟悉的领域,这样能提高你面试的成功率.
- 最后一个就是心态问题,虽然现在没有拿到理想的offer,我也觉得我挺厉害的,不要因为没有面试上就觉得自己很差劲,面试的过程就是发现问题的过程,你上一次面试没有答上来的问题,下去之后你就去找解答方法,在下一次面试的时候,你就能答上来,正视问题,找到解决办法,
- 框架代码 和OC底层的阅读,OC底层就是根据它底层的实现,你去整理它内部的实现逻辑,更有利于理解代码,为什么它要这么设计,比如 NSDictionary 的key不能存空置,我就老是记不住 是 value,还是key,不能存空值,跟数组不能add nil混在一起;还有就是这两个框架给我帮了很大的忙,跟着框架一步步实现,能够积累很多知识点,还有就是设计思想上的东西,我觉得阅读源码,对一个程序员来说实在太重要了,它能体现你的技术深度,是否了解了本质.