更新

面试基本已经结束了,目前已拿头条、百度、腾讯offer,现在可以好好来写写总结了,关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下我的准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

准备阶段

我其实从寒假前就有一点准备,不过也仅仅是过了一下基础,然后寒假去搜狐实习了。在公司一边上班一边复习(请不要举报我),系统的看书是必须的,操作系统的话我推荐看程序员的自我修养,如果想偷懒的话可以看我这篇博客一个程序是如何被机器运行起来的?,这个问题还是很有可能被问到的(不过我好像就美团二面问到了),即时不被问到,了解一下我觉得也是很有必要的。然后如果大学操作系统课程学得还算可以的话可以直接去刷题了吧我觉得,如果我算好最好还是去过一遍操作系统的教材。计网的话我看了图解HTTP和图解TCP/IP这两本书,然后基本就可以去刷题了。当然如果你有更深的追求,大佬们建议我是看TCP/IP详解,但是我到现在都还没有静下心来看一遍(真的很难看)。如果不想系统的去看书,可以看看我这的计网的系列文章计算机网络篇,至少对各个层进行大体的了解,然后对具体的问题去深入探索。数据结构和算法就是刷题了,一定要刷题,等你刷得多了,你会发现面试的大多都是你刷过的,即时你没刷过,在你刷完足够多的题后,一般的算法题你都能找到思路,因为校招算法不至于多难(ACM算法大佬就不要跟我们相提并论了)。强推《剑指Offer》这本书,这本书我至少刷了三遍吧,看了也不低于三遍。做到这些,基本就是刷面试题了(说实话我没刷)。另外,有面试机会一定不要错过,每一次面试都会是你查缺补漏的过程!!!

美团一面

记不太清了23333
主要问项目的一些技术点
如何让一个label靠左,一个label靠右,然后右边的label能够完全显示
算法奇数排在前面,偶数排在后面
智力题,一个骑手送餐,ABCD商店,送给abcd四个人
kvo的实现原理
消息调用的过程
get和post的区别
http有哪些部分
tcp和udp的区别
七层模型

总结:美团是视频面,要求手写代码。主要还是问iOS方面的经验吧,算法题很简单也很常见,感觉春招面试算法题基本都是那些常见的,从我这份面试题中也可以看出,很多重复的。那道智力题想清除了也不算难。其它就是一些必备的iOS基础和计网基础吧。

美团二面

讲一讲响应链
如何通过一个view查找它所在的viewController
如何扩大view的响应范围
微信分享大图如何实现,从进程的角度
进程间的通信方式,并举例
两个进程分别指向同一个地址空间并初始化一个值,分别输出是什么
算法,判断一个字符串是否所有的大写字母都在小写字母前面
修改podfile文件后,怎么用git diff显示出修改后版本和当前版本的不同,让我来设计
程序执行的过程
如果想要删除自己的一段代码,如何删除(在程序执行的过程中删除)
用过脚本编程吗
了解前后端吗
各科成绩,成绩排名

总结:这是我表现得最差的一轮面试吧,美团是我春招面的第一家公司,但是说实话当时准备得还不是很充分,也可以说没有面试经验吧,很多面试官问的问题我都没有get到面试官的点,不过这一面对广度深度都有要求,我面得有点懵逼,以为是一面表现得好二面故意压力面,结果并不是,猝。

阿里一面

先介绍了项目,然后问了一些项目中的问题,然后开始问基础
属性的关键字
浅拷贝和深拷贝的区别
Block的循环引用、如何解决、原理
三种Block
Block和delegate的比较
kvo的实现原理
Autorelease pool的实现原理
消息转发机制
线程死锁的四个条件
进程和线程的区别
持久化
事务的特征
中途还讨论了Masonry的约束应该写在哪里,我说应该写在layoutSubViews,他说会调用多次,然后争论了一会儿

总结:阿里一面算是一次中规中矩的一场面试吧,从介绍项目开始,然后由浅入深,主要考察iOS基础,面试官说我表现得不错,这次面试的时候我还在搜狐实习(捂脸)

阿里二面

介绍项目
性能优化
YYModel和AF源码
如何自己设计json转model
架构
迷之算法题

image.jpeg

总结:阿里的面试效率是真的不提了,二面和一面间隔时间可能相差了一个月吧,我已经从北京回到了学校开始上课了,而且这次面试感觉有点奇怪,最后那道迷之算法题我们也有讨论,实在没搞懂计算两点间的距离的算法还能怎样优化,面试结束后我问了面试官最优解是怎样的,面试官告诉我没有最优,只有更优(微笑脸)
阿里三面

一个安卓的面试官。。。。。
主要问了项目的一些东西 和给一些场景问我如何实现
自我介绍 介绍一些项目难点
主线程是相对于什么而言的
一张图片的内存占用大小是由什么决定的
索引的作用
索引的优缺点
在数组中找最小的k个数
淘宝下拉加载更多如何优化
淘宝页面发送HTTP请求的过程
介绍一下MVVM
知道哪些设计模式

总结:三面面试官主要就聊了一些具体场景问题和一些基础,基础我觉得没太大问题。面试过程中我讲到一些东西发现面试官听不懂,才知道面试官是做安卓的,问一些问题其实有点让我无语,但是总的来说还是回答过来了,感觉也没有太大问题,但是后面还是被挂了,很无奈。

头条一面

MVC的一些缺点
讲一讲其它架构
你知道哪些编码方式
算法字符串翻转
HTTPS
多线程的方式和它们的区别
队列和线程的关系
一道线程安全的题
有哪些锁
属性的关键字
assign可以用于OC对象吗
copy和strong的区别
weak如何实现自动赋nil
为什么不可变对象要用copy
assing可以使用在对象中吗

头条二面

Pod update和pod install的区别
layoutIfNeeded和setNeedsLayout的区别
抓包工具抓取HTTPS的原理
isEquel和hash的关系
SD的源码
bitmap的结构
可变数组的实现原理
如何hook一个对象的方法,而不影响其它对象
如何避免if else
自旋锁和互斥锁的区别

头条三面

介绍项目,主要介绍自己强项一点的地方
数组cop后里面的元素会复制一份新的吗
数组的浅拷贝与深拷贝
TCP为什么是三次握手和四次挥手

头条总结:头条一直都是视频面,而且是一条龙服务。总体来说感觉不错,反正主要就是需要基础足够扎实,不过之前听说的会手撕算法我倒是运气好没有碰到,就一面写了一道算法题。三面面试官等了一会儿没有来,约到了第二天(毕竟大佬都比较忙)。

声明:面试是对自我审视的一种过程,面试题和iOS程序员本身技术水平没任何关联,无论你能否全部答出,都不要对自己产生任何正面或消极的评价!有兴趣的可以加入iOS开发交流群:681503716,请备注编号《晨》,些面试资料在群文件有共享,希望每一位求职者都可以找到适合的工作)

腾讯一面

介绍项目的网络层
为什么要使用HTTP???为什么不直接用TCP
如何保证HTTP传输到达
HTTP头部有哪些内容
讲一讲拥塞控制
MVVM如何实现绑定
block和通知的区别,分别适用什么场景
算法。连续问了好几个,都是数组,层层递进的,但是我忘了,只记得最后是找出数组中重复的数字
进程和线程的区别
程序在运行时操作系统除了分配内存空间还有什么
进程间通信的方式
如何检测应用是否卡顿
好像没多少问题了,记不太清,然后他说完了,我感觉好快,以为要挂了,就强行讲了些runloop和性能优化的东西,然后他说好了,你和下一轮面试官再说吧

总结:k神前一天晚上帮我推的简历,第二天就接到电话了,效率还是比较高。打电话的时候我正在上课,面试官上来就要开始面试,我约到了晚上。这次面试其实表现得也不够好,前两个问题有点没get到面试官想问的点,问得很快。最后面试官突然说他问完了,我很虚,以为自己是挂了,然后给面试官说面试是不是太快了,iOS方面的东西好像都没怎么问。面试官说如果你觉得你还有什么没用展现出来的,你就说说吧,然后我强行讲了一些性能优化方面的东西,因为这是我唯一准备的了解得稍微有点深的东西了。最后还没讲完,面试官直接告诉我让我和下一轮面试官再讲。我不知道如果后面我不强行讲的话,这一面会不会挂,所以很多事情还是需要我们自己努力去争取机会的。

腾讯二面

OC中对象的结构
多态
Ping是什么协议
知道MTU吗
TCP头部多长,IP呢
线程同步的方式
iOS中有哪些锁
MVC和MVVM的区别
了解哪些设计模式
存一个通讯录,包括增删改查,用什么数据结构
看过哪些源码,讲讲思路
两个链表找第一个相同结点
字符串旋转
找链表的倒数第k个结点
把一个链表比某个值大的放在左边,比它小的放在右边
二叉树的中序遍历,非递归

总结:主要还是基础,腾讯是真的喜欢问计网和数据结构。这一轮面试我可以说是裸面了,那几天都在放飞自我,因为那时候已经拿了头条offer,也没有其它想法了,就想着随便面面吧,不过也无所谓。还好面试的时候还能进入状态,虽然面得不是特别好,不过基本上还是能答出来,最后的二叉树遍历,由于平常都想的是递归,一直没怎么注意非递归的实现,我卡了一会儿,还好最后还是想出来了(请不要嘲笑我)。
中间有个小插曲,就是过了几天我在公众号上面查发现我的状态已经挂了,都已经“心灰意冷”了,结果昨天收到一个广东深圳的电话,当时心里就挺激动的,接通后果然是腾讯的HR,意外惊喜。

百度一面

大概回忆一下
进程和线程的区别
一个进程有哪些区
拥塞控制
进程间通信的方式
七层模型
TCP和UDP的区别
传输层和网络层分别是做什么的
UDP可以实现一对多??
算法 求数组的最长子数组
Http2.0如1.x的区别

总结:开始是把我推给的一个偏网络层做C++的部门,所以面试基本都是计算机基础,也讲了一些iOS的东西,但是我猜面试官可能也不是做iOS的。本来打算问我C++,我果断说自己没怎么写过C++,如果问C++我肯定hold不住。

百度二面

发送一个HTTP请求的过程
TCP是如何保证可靠的
内核态和用户态的区别
在一个10G的数据里面找出最大的100个数
讲一下我最满意的一个项目
然后讲了一下网络造成卡顿的原因

总结:这一面是把我转到做APM的那个组后面的,感觉面试官时间很急,面得有些突兀,不过没有太大的问题,所以基本就让我过了吧。

百度三面

全是问得iOS方面的问题,问得真的很细,需要基础很扎实,对各个机制真的足够理解,不然确实有点难回答。我只列举一下大概方向,这些东西也是iOS开发必须掌握的基础吧
属性的关键字方面的
内存管理方面的
多线程
各种队列
线程锁
MVVM

总结:本来前一面面完都说我技术面已经通过了,我还很诧异,结果发现是搞错了,所以补了这一面,就是考察一下我iOS方面的能力到底是否有水分吧。问得很细,确实需要基础足够扎实才行。

写在最后

以上的面试题肯定是不完整的,只能根据我的印象记录我能想起来的了,而且即时是一个看似简单的题,你如果没有真正弄明白它的原理的话,在面试过程中你也很有可能被问懵,所以一定要打好基础,要知其然并知其所以然。如果你能把上面的问题搞得很清楚的话,我觉得BAT的offer应该都是没有问题的。当然有时候面试还是要看一点运气的,所以我们还需要抓住每一次面试机会。希望面试的同学一切顺利。