来自一份大牛的 iOS 开发大厂面试全攻略(2020斩获offer)

▼魔方 西西 提交于 2020-08-09 22:37:38

前言

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

 

2020 一场突如起来的疫情,打乱了很多人的生活节奏。我恰好在年后因为一些原因要找工作,也看到周围很多朋友有聊到在疫情期的求职百态,掺杂着个人几年来的面试经验和感悟写下的了本文。

面试过程

在疫情期间都是远程面试,下边先介绍一下疫情期间面试的一些公司的面试情况。同时拿到了其中几家的 offer。下边介绍的面试题只还原了其中印象比较深的部分,会存在不足的情况,并不代表面试的全部。

百度iOS面试

一面

  • 1、iOS基础知识
  • 2、Python基础知识,大概是多线程,线程安全,集合类,JVM,类相关知识等。
  • 3、iOS一些源码的阅读
  • 4、优秀的第三方框架源码阅读
  • 5、GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。
  • 6、询问当前做的项目,以及到具体的实现和优化。
  • 7、多进程间的通讯,Binder机制。
  • 8、询问看过哪些框架源码,EventBus,Volley讲了一下。

二面

  • 1、Delegate 、Notification和KVO比较各自的优缺点
  • 2、在一个UI的正中间实现一个正方形的红色视图有几种方式?
  • 3、手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?
  • 4、UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,
  • 5、UIViewController 的view是否加载了?如果没有加载那什么时候加载?
  • 直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?
  • 6、AFNetworking是否支持ipv6?
  • 7、项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?
  • 8、iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?
  • 9、一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?
  • 10、说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?
  • 11、[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?
  • 12、Images.xcassets和直接用图片有什么不一样?

三面
全是问得iOS方面的问题,问得真的很细,需要基础很扎实,对各个机制真的足够理解,不然确实有点难回答。

  • 1、内存管理方面的
  • 2、多线程
  • 3、各种队列
  • 4、线程锁
  • 5、MVVM
  • 就是考察一下我iOS方面的能力到底是否有水分吧。问得很细,确实需要基础足够扎实才行。

Bigo

感觉面试的这些公司,Bigo 对于基础的考察最全面。

一面

  • (算法)找出一个页面中漏出部分面积最大的试图,重合的部分按照最上层的面积算漏出,会有时间复杂度的要求。
  • 简单地介绍的过往的项目经验
  • 控件的点击事件和添加在上边的手势谁先响应,并说明原因
  • 谈 CoreAnimation 和 CoreGraphic 的区别
  • 说 @synchronized 锁的实现原理,并说明其中可能存在的问题。同时介绍了 iOS 开发中常见的锁。
  • 介绍编译的过程和原理
  • 谈对于 bitcode 的理解和作用。
  • 详细的介绍了 Https 的过程。

二面

  • 介绍属性常用修饰符,介绍 assign 和 weak 之间的区别。这块会延伸到内存管理相关,比如引用计数的方式。
  • 聊对于 GCD 的理解,和 GCD 底层是如何进行线程调度的。聊 GCD 中常见方法的使用 (group ,信号量
    ,barrier 等)
  • 详细的介绍了 KVC 和 KVO 的原理。
  • 介绍消息转发过程
  • 介绍对于 Runloop 并介绍知道的应用场景。再具体场景中会有追问。
  • 介绍项目优化的经验,这一块会聊的比较细。
  • 介绍对于静态库和动态库的理解。
  • 在 webview 使用过程中存在的问题和解决方案。

三面

  • 介绍了过往 RN 的使用经验和对于 Flutter 的理解。
  • 谈对于组件化的理解和市面上常见的组件化方案
  • 问了一些 APM 向上的问题。
  • 谈个人对于项目架构选择的理解。自己如何进行架构的选择(主要对于 MVVM,MVC等,后文有个人对于这一块的理解)
  • 谈个人规划

对一些同行的某些想法想说的

“行业不景气了”
这句话每个月都会听到一两次。
今年上半年很多朋友在面试,可能因为有些朋友不是很顺利,有感而发了。
而且笔者上半年也在给公司招人,招的是高级 iOS 开发,有一个感觉就是很难招。虽然年限已经有3,4年了,但是关于设计模式,数据结构,iOS 底层方面的知识了解的甚少,开源库也只看过SDWebimage(或许只是看了网上的解析而已),总之没有达到笔者个人对一个高级 iOS 开发的要求。


但是反过来我也听到好多人去了很不错的公司,比如今日头条,BAT等等,评级也比较高。

所以笔者个人觉得并不是这个行业不景气,而恰恰是很多开发者没有保持一个持续学习的状态,只是将一年的经验重复多年,最终导致自己的能力小于所属年限的能力标准的情况出现。

笔者认为既然做为一名软件开发人员,就要不断地突破自己。对于前端的开发人员,要尽可能地多学一些脱离UI层面上的通用性的知识,比如数据结构和算法,网络协议,设计模式,看一些好的开源库也是不错的(上半年面试了不少于10个人,问看过哪些开源库没有一个不说SDWebImage的)。

“因为我学历不好,所以很难拿到面试机会”

这些话在跟我比较熟的同行里面听到比较多,他们觉得自己的面试机会受限于学历。

但其实简历上面可以吸引人的地方可以有很多:高质量的博客,高质量的Github代码,优秀的项目经验,有深度的技术分享等等。

有句话笔者个人非常喜欢:

Alter what is changeable, and accept what is immutable

意思是改变能改变的,接收不能改变的。学历既然很难改变了,那就接受它,不去抱怨,不去拿它当借口,应该把精力放在能改变的事情上:

  1. 博客:现在自己搭建博客都是很容易的事情,有现成的框架(hexo),学习成本很低,如果你有一定的技术积累可以在这里做一下介绍。
  2. GitHub:这个就不用介绍了,如果你封装了好用的组件就可以放在上面,不断更新优化,能体现出个人的成长。如果能参与大型的开源项目就更好了。
  3. 项目经验:这个可能也是个人无法掌控的,但是你可以将某个功能点做到极致不是么?
    技术分享:如果你研究了一个新技术,是否可以给同事们分享一下呢?同时也可以锻炼下自己。
    笔者个人是比较看重1,2点的:从这两点可以看出这个人对技术的追求,是否热衷于分享,是否有比较好的表达能力和思路。而3,4点由于客观方面的影响比较多一些,所以相对来说笔者个人并不是很侧重。

笔者看到过一项调查:相对来说学历越高,毕业学校越好的开发者往往在GitHub和博客上面产出更多。这不失为一个值得思考的问题,同时也更加说明了学历和毕业学校相对来说不是那么太靠前的开发者更要注重GitHub和博客这两块。

“(大公司)面试造火箭,工作拧螺丝。”

这句话也听过不少次了,能听出来说这句话的人多数带着些许负面情绪说的。

笔者个人认为大公司的这种招人策略是非常道理的:因为既然是大公司,有丰富的资源,它要么是正在造火箭,要么就是准备造火箭,所以招人的话肯定是招那些已经具备造火箭能力的人或者是那些培养之后可以造火箭的基础比较好的人。而且万丈高楼平地起,总不会大家都是围着设计图讨论吧?每个人都有每个人的职责,况且哪个将领不是从士兵开始做起的呢?

所以我们应该以正确的态度去对待这件事情:

如果你真的想进大公司,那么就削尖了脑袋,好好准备底层知识和算法题去争取:拿到offer最好,就算拿不到也肯定会有收获,毕竟你努力了,你也切身体会了一次大公司的要求。
如果你真的不想进大公司,那么就尽量不要去惦记这件事情,更不要去传播这种负面情绪。
如果你还没确定要不要去大公司,那么最好现在就定一下方向,方向有了计划才会有,计划有了才会有成果出来。

以上就是笔者这段时间的一些思考和想法了。

这篇总结就在这里写完了,一共两个部分,希望您能有所收获,也非常欢迎能跟我一起交流~

推荐👇:

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:789143298 ,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

申请即送:

    • ——点击加入:iOS开发交流群

    • BAT大厂面试题、独家面试工具包,

    • 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,

       
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!