iOS面试总结(2020年6月)

都说今年互联网行情很差,作为被大家喊了好几年“iOS开发没人要了”的iOS行情更差。那真实情况是什么样的呢,以我的经历给大家分析下。应某个朋友建议,去掉这一句啊,目前iOS岗位还是挺多的,你可以这么想只要苹果爸爸不倒,iOS开发就不会没人要。但另一方面,招聘方对iOS开发的要求是在不断提高的,我们不能固步自封,满足现状,只有不断学习,不断进步,才能保持自身竞争力。

我的面试的阶段基本都在6月份,准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会,前期由于准备不足也错失了一些机会,在之后的面试中不断总结经验,越来越有信心了,最终选择了爱奇艺。整体来看求职情况还算可以,不是很好但也不是很差,其中会带有一定运气成分,所以要换工作的话一定不要裸辞。

这里总结下这段时间的面试经历和一些心得,后面会附上期间遇到的面试题,大家可以尝试作答一下。

求职准备

如果确定了想要换工作就应该为求职做准备了。

知识准备

在确定了换工作的想法之后,我们就应该为面试做准备了。在回顾知识点的时候我建议分类去梳理:OC语法,Runtime,Runloop,多线程,性能优化等,这些是优先级高的内容,其次是网络知识,数据结构与算法等计算机通识知识。

有一本书非常推荐:《Objective-C高级编程》,建议精读。

开源库的话看Runtime(最新为可编译799.1版本)吧,把类的定义,Runloop,weak,Autoreleasepool相关的代码都看下。

网络的知识点可以参考我的那篇:iOS面试备战-网络篇。数据结构与算法,按照类别刷个几十题应该能应付大多数情况了,iOS面试一般不会有太难的算法题。

简历

简历是求职的第一步,也是你能否获得面试机会的敲门砖,我们一定要好好打磨下。下面是我在脉脉上看到的HR在筛选简历时主要关注的点:

我在今年3月份的时候尝试投过几次简历,并没有太好的结果,后来进行了一些调整优化。6月份再投的时候相对好了些,陆续收到了些回应。本人之前并没有大厂经历,不是一流本科,但也能收到不少大厂的面试机会,所以我感觉自己的简历内容还是起到了一定的作用的。如果想参考我简历的话,可以关注公众号:「iOS成长之路」,回复:简历,进行下载。

上面有提到“高光时刻”,可以理解成亮点。怎么让自己的简历跟同能力水平的求职者不同,那就是找到属于我们的亮点。有一个建议,我们在写简历时,可以刻意夸大自己的能力,或者写我们想成为的样子,再之后我们就对着简历让这些内容一一实现,让它们变成自己的亮点。一定要注意不能只吹牛,不落实,因为被发现“造假”可是很严重的。

简历投递

以我的经历来说,相对靠谱的简历投递方式有:Boss直聘、脉脉、内推。

需要注意的是,Boss直聘和脉脉只有别人联系你,你再投递,反馈率才会高一些。如果是你主动联系的招聘方,那大概率是不会收到回应的。推测很多企业并没有很多的招聘岗位也会把招聘信息挂在上面,这种时候HR是不会关注投递的简历的。这也是为什么能看到很多人晒出投递上百个简历确一个回应的都没有的情况,不要气馁,这不一定代表你能力不行。

等招聘者联系是相对被动的,主动出击会更有效。那就是寻找内推,一般公司内推都有奖励的,所以公司内部人员都乐意去发布职位获取内推人选。脉脉,掘金,V2EX,一些知名公众号都能发现不少内推岗位,我们可以自己去挖掘。

面试流程

目前互联网公司大部分是2轮技术面+1轮HR,或三轮技术面+1轮HR。目前的面试形式多为视频面试,也有些是电话面试。视频面试的话,如果是通过Zoom,企业微信,钉钉等一般是不考察手写代码的。如果是通过牛客网,一般是会考察手写代码的。对于手写代码,仅有算法题会要求准确性,可运行,对于设计类题目,我们写出伪代码即可。

如果到了HR轮基本说明我们已经通过了面试,如果确定入职,接下来就是背调,薪资证明,学历证明,入职体检等一系列操作。

面试题

以下是我面试过程中遇到的面试题,其中网络多线程问题已经分成两篇单独讲解了,这里就去除了这两部分。

Swift

因为我最近两年多一直在用Swift,面试开始的自我介绍环节,我也会着重提这一点。但是很不幸,我得到的答案基本都是:面试主要考察OC。这也说明了大部分公司对Swift态度还是非常保守的,所以除非招聘信息里写了要求Swift技能,否则我们是没有必要专门准备Swift相关面试的。

当然面试过程中也遇到了几个Swift问题:

1、Swift中struct和class有什么区别?

2、Swift中的方法调用有哪些形式?

3、Swift和OC有什么区别?

4、从OC向Swift迁移的时候遇到过什么问题?

5、怎么理解面向协议编程?

OC语法

1、Block是如何实现的?Block对应的数据结构是什么样子的?__block的作用是什么?它对应的数据结构又是什么样子的?

2、GCD中的Block是在堆上还是栈上?

3、NSCoding协议是干什么用的?

4、KVO的实现原理

5、NSOperation有哪些特性比着GCD有哪些优点,它有哪些API?

6、NSNotificaiton是同步还是异步的,如果发通知时在子线程,接收在哪个线程?

UI

1、事件响应链是如何传递的?

2、什么是异步渲染?

3、layoutsubviews是在什么时机调用的?

4、一张图片的展示经历了哪些步骤?

5、什么是离屏渲染,什么情况会导致离屏渲染?

6、CoreAnimation这个框架的作用什么,它跟UIKit的关系是什么?

引用计数

1、ARC方案的原理是什么?它是在什么时候做的隐式添加release操作?

2、循环引用有哪些场景,如何避免?

3、为什么当我们在使用block时外面是weak 声明一个weakSelf,还要在block内部使用strong再持有一下?

4、Autoreleasepool是实现机制是什么?它是什么时候释放内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么,为什么要设计它?

5、哪些对象会放入到Autoreleasepool中?

6、weak的实现原理是什么?当引用对象销毁是它是如何管理内部的Hash表的?(这里要参阅weak源码)

Runtime

1、消息发送的流程是怎样的?

2、关联对象时什么情况下会导致内存泄露?

3、消息转发的流程是什么?

4、category能否添加属性,为什么?能否添加实例变量,为什么?

5、元类的作用是什么?

6、类方法是存储到什么地方的?类属性呢?

7、讲几个runtime的应用场景

Runloop

1、讲一下对Runloop的理解?

2、可以用Runloop实现什么功能?

性能优化

1、对TableView进行性能优化有哪些方式?

2、Xcode的Instruments都有哪些调试的工具?

3、讲一下你做过的性能优化的事情。

4、如何检测卡顿,都有哪些方法?

5、缩小包体积有哪些方案?

计算机相关

1、项目编译的流程是什么?手机上的应用程序自点击图标开始到首屏内容展示都经历了哪些步骤?

2、对于基本数据类型,一般是存储到栈中的,它有没有可能存在堆上,什么情况下会存储到堆上?

3、数据库中的事务是什么意思?

4、使用过什么数据库(我回答的Sqlite,Realm),Realm在使用时有哪些注意事项,如何实现批量操作?

5、LRU算法是否了解,如何实现一套LRU算法?

6、知道哪些设计模式,怎么理解设计模式的作用?

7、如果有1000万个Int类型的数字,如何对他们排序?

8、设计一套数据库方案,实现类似微信的搜索关键词能快速检索出包含该字符串的聊天信息,并展示对应数量(聊天记录的数据量较大)。

简历相关问题

1、Lottie实现动画效果的原理是什么?

2、OClint实现静态分析的原理是什么,它是如何做到的?

3、MVVM和MVC有什么区别?

4、静态库和动态库的区别是什么?

5、了解Flutter吗?它有没有使用UIKit?它是如何渲染UI的?

6、二进制重排的核心依据是什么?

7、如何设计一套切换主题的方案?

8、AVPlayer和IJKPlayer有什么区别?用IJKPlayer如何实现一个缓存视频列表每条视频前1s的内容?

9、类似微博的短视频列表,滑动停留播放,如何实现?

10、使用python做过哪些事?如何理解脚本语言?

数据结构与算法

1、什么是Hash表,什么是Hash碰撞,解决Hash碰撞有什么方法?

2、如何遍历二叉树?

3、简述下快速排序的过程,时间复杂度是多少?

4、有一个整数数组,如何只遍历一遍就实现让该数组奇数都在前面,偶数都在后面?

5、假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

6、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。leetcode 7

7、有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。

2个红气球+1个黄气球可以兑换1个蓝气球。

2个黄气球+1个蓝气球可以兑换1个红气球。

2个蓝气球+1个红气球可以兑换1个黄气球。

现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。

软技能

1、做过哪些工作职责之外的事情?

2、经历过最难的一次业务开发是什么样的,最终怎么解决的?

3、最近有学习什么新技术吗?有何收获?

4、你最擅长iOS哪方面的知识?怎么体现出来的?

5、常用哪些开源库,有没有研究过他们的原理?

6、如何保持个人成长?

流程型问题

流程性问题基本都会包含下面四个,最好提前准备好

1、请做下自我介绍。

2、你有什么问题要问我的吗?

3、为什么离职?

4、对下份工作的期望是什么样的?

这些问题看似不起眼,但其实还挺重要的,很有可能面试官就是通过这几个问题决定了要不要你通过面试。

自我介绍就不说了,简明扼要介绍自己近几年的经历和成绩就行,控制在一分钟以内。

第二个,最好不要直接说没有问题了,提问面试官是我们整个面试过程中少有的掌握主动权的时刻,它可以体现我们自主思考的能力。最好提前了解下公司和招聘需求,准备几个问题,或者面试过程中提出我们产生的一些疑问。

离职原因,这个如实回答即可,只要不说是因为钱或者跟领导同事不和基本都没有问题。

下份工作的期望,这个就看各自的需求吧。

总结

通过这些面试题,我们可以看出一些端倪。

1、面试官更喜欢“刨根问底”,对着一个概念不断的往深处延展,不断深入的问。这类问题会有很大的区分度,第一问第二问第三问难度逐次提高,用于筛选不同的面试者。这也提醒我们某些知识点不光要知道原理,还要知道为什么这么设计,这么设计的好处是什么。

2、问题范围更全面化,特别是二面时,问题不再局限于iOS端,而是更通用的计算机方向问题,这个需要我们平常多积累;还有就是开始重视个人软技能,学习能力和上进心。

3、围绕简历,还记得上面说过写简历时要吹牛逼吗。在面试的时候一定要把他们成为自己真正掌握的知识。

4、注重软技能,这个比前面几条作用稍微小些,但是如果被问到了,而我们也有很好的贴合点,那绝对就是加分项。我的一次经历是,当我向面试官说自己有写博客的习惯,他问我是否知道medium,我说知道,还翻译过几篇里面的文章,接着说了些我理解的国内外博客平台的现状分析。这种情况就属于加分项了。

另外面试是一次考察自己知识掌握程度的考核,考的好能提升自己自信心,考的不好可以帮助我们定位自身问题,不管怎么说都是不亏的。面试还可以帮助我们了解市场行情,薪资待遇,自身竞争力,流行技术栈等一系列情况。所以真的建议即使不考虑换工作,每年固定时间也可以出去面试几次。

iOS面试备战-多线程

iOS面试中多线程绝对是最重要的知识点之一,它在日常开发中会被广泛使用,而且多线程是有很多区分度很高的题目可供考察的。这篇文章会梳理下多线程和GCD相关的概念和几个典型问题。因为GCD相关的API用OC看着更直管一些,所以这期实例就都用OC语言书写。

阅读更多

iOS面试备战-网络

计算机网络是计算机科学与技术专业的必修课,也是移动端,前端,后端都会涉及到的知识点,同时它也是iOS面试中大概率会出现的问题。所以准备面试的话,网络相关的知识点一定不能错过。这里总结了一些我认为有用的和最近面试遇到的网络相关知识点。

去年写过一篇《图解TCP/IP》总结的文章,也可以对着看下。

阅读更多

Swift进阶黄金之路(二)

image-20200511230812677

Swift进阶黄金之路(一)

上期遗留一个问题:为什么 rethrows 一般用在参数中含有可以 throws 的方法的高阶函数中。

我们可以结合Swift的官方文档对rethrows再做一遍回顾:

A function or method can be declared with the rethrows keyword to indicate that it throws an error only if one of its function parameters throws an error. These functions and methods are known as rethrowing functions and rethrowing methods. Rethrowing functions and methods must have at least one throwing function parameter.

返回rethrows的函数要求至少有一个可抛出异常的函数式参数,而有以函数作为参数的函数就叫做高阶函数。

这期分两方面介绍Swift:特性修饰词和一些重要的Swift概念。

阅读更多

如何通过静态分析提高iOS代码质量


随着项目的扩大,依靠人工codereview来保证项目的质量,越来越不现实,这时就有必要借助于一种自动化的代码审查工具:程序静态分析

程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。(来自百度百科)

词法分析,语法分析等工作是由编译器进行的,所以对iOS项目为了完成静态分析,我们需要借助于编译器。对于OC语言的静态分析可以完全通过Clang,对于Swift的静态分析除了Clange还需要借助于SourceKit

Swift语言对应的静态分析工具是SwiftLint,OC语言对应的静态分析工具有Infer和OCLitn。以下会是对各个静态分析工具的安装和使用做一个介绍。

阅读更多

Swift进阶黄金之路

image-20200511230812677

Swift进阶黄金之路(二)

这篇是对一文鉴定是Swift的王者,还是青铜文章中问题的解答。这些问题仅仅是表层概念,属于知识点,在我看来即使都很清楚也并不能代表上了王者,如果非要用段位类比的话,黄金还是合理的😄。

Swift是一门上手容易,但是精通较难的语言。即使下面这些内容都不清楚也不妨碍你开发业务需求,但是了解之后它能够帮助我们写出更加Swifty的代码。

阅读更多

iOS开发图片格式选择

图片是如何显示的

在讲解如何选择图片格式之前,我感觉有必要先了解下,图片是如何展示的。如果我们要展示一张图片,一般步骤是这样的:

1
2
3
4
5
/// Assets.xcassets中的图片,不需要后缀
let image = UIImage(named: "icon")
let imageView = UIImageView(frame: rect)
imageView.image = image
view.addSubview(imageView)

运行程序,我们就可以在指定位置看到这个icon。看似简单的代码背后隐藏了很多细节工作。一张图片的展示,从代码执行到展示出来大致经历了这些步骤:

阅读更多

快手iOS面经

背景

过完年来北京之后,有准备看看机会,也是想了解下市场行情。简历没有投太多,只定向投了头条教育部门、抖音、快手、阿里,这些公司。头条和阿里的简历都没过,肯定是亮点太少吧。只有快手简历过了,快手是三轮技术面+一轮HR面,前两轮技术都比较顺利,到第三轮却栽了,很痛心o(╥﹏╥)o。目前就不考虑换工作了,等下半年再说了,接下来的时间再好好精炼一下。

快手是视频面试,不支持周末,但是可以选择晚上时间,我这几次都是定在了晚上九点。视频面试是通过牛客网进行的,以下是我还记得下来的各轮面试题,对于一些iOS基础知识就不做解答了。

阅读更多

Runtime内存模型探究

Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。

可以这么理解,Objective-C = C + Runtime,Runtime是将C语言具有面向对象功能的推动剂,是iOS开发中的核心概念。我们可以在苹果开源的 runtime(当前的最新版本objc4-779.1.tar.gz)中可以发现一些 Objective-C 对象模型的实现细节。

阅读更多

VSCode配置Python版本

刚学习Python没多久,对VSCode也不是很熟悉,在一次解问题的过程中,加深了对这两者的印象,于是记录一下。

环境:Mac OS 10.15,VSCode 1.41.1

问题定位

我在尝试用VSCode写python爬虫,遇到一个问题ImportError: No module named requests

通过问题描述很容易知道问题,这是因为导入了requests库,但是VSCode却没有找到这个库。

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×