毕业后第三次求职,从6月12号开始到7月4号拿到满意的offer,期间面试了十七家公司,年中很多公司都是不招人的,所以投递的也包括一些创业公司。
之前工作的两家公司都是创业型公司,学习到很多,同时也发现了各种限制,尤其是不太重视前端质量的项目。这次找工作的主要目标是大公司,自我感觉,四年工作经验这个节点是个分水岭,如果再不找机会进入大公司磨练下,以后的机会会越来越小。
面试过程可能被虐,但每次面试后的总结都能使自己发现之前不曾在意的知识点或其他的(比如交流方式等)不足之处。
最大的感触就是与技术面试官和与HR面试时要处在不同的立场,与技术面试官交流时一定要坦诚点,很多内容一张口对方就懂了,而与HR面试时就要尽可能的表现出自信,尽量不要谈论自己在技术方面的劣势,表达不好的话HR作为纯外行,就会觉得是个人能力不足的原因。
2019.6.12
第一家
只有面试环节
面试基础问题
-
static修饰符
-
沙盒的目录
参考:iOS本地数据持久化
-
什么时候将weak修饰的对象置为nil,具体怎么实现
这个问题网上搜到的答案很多,自己只知道涉及hash表的知识,描述的不是很理想,可以从runtime及整个流程来回答。
另外面试官反复问是什么时候置为nil的,自己的回答是dealloc的时候,面试官不是很满意。
参考:最基本的回答
参考:什么时候置为nil->只会在autoreleasepool drain的时候才会被更新为nil。
更深层次的问题:weak指针的线程安全和自动置nil的深度探讨、质量监控-野指针定位
这两篇深层次的文章已经很难了,常常会涉及底层C语言的API。
面试高级问题
-
真正的内存优化
听到面试官问到这个问题时,自己简单想了下,准备先说自己项目中用到的,然后再讲之前在网上查到的方法。
首先是开发过程中提前发现内存泄漏的代码,使用MLeaksFinder检测,面试官就这个第三方库询问了很多,等于是被截胡了,下面会有这一块的详细内容。
本来准备的有离屏渲染相关、UITableView高度缓存等,没有机会回答。
-
MLeaksFinder的实现原理
面试官问了实现原理,自己只想起MLeaksFinder 新特性中提到的FBRetainCycleDetector,就说了这些以及对象的生命周期和计数器原理。面试官应该是觉得回答的不满意,他给的建议是不能只停留在看sdk使用文档的阶段,要自己去熟悉sdk中的代码。
后续发现MLeaksFinder 新特性这篇博文只是0.2版本的一些新特性,MLeaksFinder:精准 iOS 内存泄露检测工具这篇博文中有原理的介绍。
另一个问题是MLeaksFinder的缺点,自己当时只知道有些系统控件会一直报错,需要添加白名单,面试官觉得不够全面,或者他们有自己的比MLeaksFinder更好的内存检测工具?这也无从得知了。
6月30号补充,MLeaksFinder只能发现UIView的内存泄漏。
后续查找了相关文章,发现一些操作确实也会触发弹框,参考使用MLeaksFinder时遇到的坑
-
加载过大图片时出现内存警告如何处理
这是面试官就内存优化问题提出的一个具体场景,之前没接触过,就老实说了不会。面试官提到了Apple Developer,后续查找的方法中也提到了,这一点是很重要的,Apple Developer中提到的技术还是要多了解的。
参考:iOS 加载高清大图片
-
gcd及Block的真正原理、多线程编程的高级用法
面试官问了下在哪些地方使用了gcd,自己的回答是创建单例时、一些常规的线程操作、创建定时器,得到的反馈依旧是过于表面,同时提到了block和多线程的高级用法,因为gcd问题的原因,后续也没多问。
工作其间,反复的查了gcd和block的原理之类的知识,但过一段事件后总是会忘掉,可能是因为太过碎片化,这一块的内容还是要系统的学习下,只靠网上看的几篇文章是不可能真正掌握的。
-
如何来设计一个业务流程的埋点
面试官结语
- 简历太浅
- 做的都是创业项目,业务不够复杂,交互不够复杂,代码要求低,技能还需提升
- 应聘的岗位需要独立负责App,胜任不了
其他
简历中的熟悉C语言应该删除了,因为C的上限太高,自己只是前段时间读了《C Primer Plus》一书,更多的是复习下基础的C语言知识,还远远达不到熟悉C语言的程度。
2019.6.18
第二家
机试题

- 第一题
找出给定字符串中的所有的连续递增和连续递减的自字符串。子字符串长度至少是2。
半小时内,尝试用OC完成,没有成功,其中涉及char字符的操作,还是用C语言实现比较合理。并且通过第二题也可以看出来他们使用的开发语言是Swift。
- 第二题
为了监控目标系统的运行情况,我们会每秒检测目标系统的指标v(整数),如果连续n秒监控的指标不大于预期e,则报警。
需求:
实现一个Monitor类,这个类的构造方法接收参数n和e,这个类对外提供一个checkException方法,将来这个方法会被外部不停的调用接收每秒监控的数据,如果满足报警条件则返回true,否则返回false。
面试结论:
由于第一题没有做出来,并且近期没使用Swift编写代码,所以主动退出了岗位竞争。
第三家
笔试部分
- 推送的原理
- 实现一个算法:找出一个无序数字数组中第二大的元素
- 写出自己最熟悉的项目架构
面试部分
有基础的问题,只记录印象深刻的
-
cell复用池的数据结构
-
如何提前释放一个单例
-
他们公司app某些页面的如何实现,以及时间预估
考察个人的时间管理能力。
-
是否能接受996及大小周
面试总结:
面试官是一个小姐姐,去年遇到过一个程序媛面试官,今年又遇到一个。都还蛮严肃的...
暴露了自己的另一个短处,就是和人说话容易紧张,有些问题本能回答的更好的。
革命尚未成功,同志仍需努力。
2019.6.20
第四家
总共进行了两轮面试。
比较吸引自己的是,他们的项目拿过上过App Store官方的推荐位,现在的工作重点是app的优化,之前下载了他们的app,页面之间的交互确实做的很优秀。
第一轮技术面试,能感觉得出面试官是技术大佬,但是氛围还是很轻松的,问了一些技术问题,具体问题记不太清楚了,自己的回答还算满意,知道的就好好回答,不清楚的就坦诚交待。已经发现规律了,凡是能记清楚的问题都是面试时折磨过自己的问题。聊了40分钟左右。
第二轮hr面试,氛围也很轻松,聊的主要是之前任职的2家公司的一些业务情况,还有自己的职业规划,平时的生活习惯,个人爱好之类的,聊了大概半个小时。回想起来,其中有2个问题语言组织的不好。
第一个问题是是否打算在上海落户,自己确实是没这个打算的,就直接说了没有落户打算,但是会在上海长久发展,假如时光可以倒流,自己对于这个问题的回答本意还是不变,但是会好好组织下语言,从个人经济情况等方面多谈一下,毕竟有些话是:言者无意、听者有心。同样的意思,但是会让不同的人有截然不同想法。
第二个问题是是否投递了其他知名公司,自己也如是回答了,说投了拼多多、B站、小红书等,坦白说这些也没问题,但是如果hr是想通过这个问题来验证员工的稳定性的话,就需要在原回答的基础上补充一些内容,补充的内容需要传达出自己并不会随意跳槽的意思。这也只是一种推测,或许hr这问题就是随便问问。
总结:
自己对这家公司的感觉还是很不错的,觉得技术方面也满足他们的要求,如果能入职的话,对个人的成长也很有利。面试官和hr也都讲清楚了,他们是996的工作模式,自己也能接收。
第五家
其实面试过程中一直不是很懂他们的业务流程,过后才查了下照片直播的定义,大体上清楚了。
第一轮是iOS技术面试官面试,问题如下:
-
iOS内存管理机制,对象刚创建时计数器是多少?对象什么时候释放?
参考:iOS之引用计数
-
copy的用法,为什么NSString要用copy修饰?ARC中用strong和copy修饰block有什么区别(参考)?
-
持久化存储
回答了一些常规操作,提到了使用NSUserDefaults存储用户名和密码实现自动登录时,面试官提出了疑问,这种做法的安全性如何?由于是第一家公司的项目中用到的,自己一开始忘了具体逻辑,所以在回答安全措施时有点慌,后来慢慢想起来了,就从密码加密、本地加密补充串、网络请求参数再次加密这几条回答了防止别人抓包来得到密码的措施。
-
对组件化的理解
说了自己对组件化的了解,以及蘑菇街组件化。后面更多的是学习面试官对组件化的理解,组件化的必要性、组件化需要解决的根本问题等,对于组件化需要解决的根本问题这一点自己暂时也没理解面试官的意思,后续还是要多深入了解的。
-
MVVM的理解,哪些操作需要放在VM中?
第二轮是技术总监面试
主要聊的是我之前做过的几个项目的盈利模式,和他们公司项目的情况,技术问题就问了一个:app上相册的实现,主要的难点是相册里图片很多,比如上万张。
第六家
这个公司的技术团队还在组建中。
第一轮是hr面试,问的问题比较杂,从之前任职公司的状态到个人的职业规划之类的,都是主观性的问题,就跟朋友之间聊天一样。这个hr小姐姐的表达能力还是很强的,在之前电话邀请面试时,就介绍了公司的情况,项目还是蛮不错的,只是不符合自己目前的要求。
第二轮是一个iOS小姐姐面的,可能她也是刚入职的,所以问的都是些常用的问题。有几个问题没回答出来:
-
一个可变数组,其中的每个元素也都是一个可变数组,然后使用对该数组进行copy操作,得到的新数组中每个子数组是可变还是不可变的?
-
要实现一个统一的方法,可以在viewDidLoad中的第一行和最后一行处打点
-
在for循环和for in循环中对原数组中进行增删改操作,会怎么样?
2019.6.21
第七家
电话面试
-
category添加属性的原理
参考:动态添加属性-关联的原理
-
https的原理
-
跨域
-
RAC
-
对组件化的了解
2019.6.22
第八家
电话面试
-
OC调用方法的原理,及调用方法时的缓存机制
-
__block的原理
参考:Block原理
2019.6.24
第九家
这家公司是个很小的创业型公司,招iOS也是为了上包,不是自己期望的类型。面试也分两轮,第一轮是hr姐姐,问的都是很主观的问题,比如生活状态什么的;第二轮是总监或者老板,其中的一个问题,交流的过程有点不愉快,但是确实能让自己换个角度考虑问题。
-
为什么要离职
这个问题在前几家面试时也被问到过,自己的回答都是为了提升自己,所以这次也这样讲了,这个面试官就直接说这个答案他听过很多,但是他自己是很不满意这个答案的。作为公司管理者,招聘的员工的工作重点肯定是要放在为公司解决问题上,而不是整天想着学习学习。个人不是很赞同他的观点,it行业日新月异,不学习肯定是不行的,再说个人学习就一定会耽搁公司的业务吗?
不过求职时确实要学会从领导者的角度考虑问题。
第十家
心心念的公司。
第一印象
一进公司大楼,就明显感觉到公司的氛围。面试者是通过微信进行签到的,签到之后在大厅沙发上等待hr小姐姐,等候区人员还是蛮多的,不过从着装和谈吐来看,多半不是技术应聘者,相比之下技术应聘者等待的时间比较短,10分钟后就有hr小姐姐带自己进去面试。
面试过程
自己投递的是iOS直播部门,面试过程很轻松,虽然也有多个没有回答好的问题,但面试官并不会给自己很大的压力,而是引导自己来回答问题。
面试结束,面试官的评语:我是具备实现具体业务的能力的,但是直播部门在技术方面有特殊的要求,优化的工作会比较多,需要具备底层和设计理念方面的专业知识,所以我不太适合这份工作,建议投递iOS的其他部门。
以下是几个印象比较深刻的问题:
-
对组件化的理解,说几个组件化的方案,如果实现一个路由协议,有没有实践过组件化
-
对跨平台的理解,说几个跨平台的方案,RN和flutter的区别,RN的桥接是如何实现的
-
swift和oc的区别
-
runtime的理解,分类为什么不能添加属性,运行时为什么不能修改isa指针指向结构体中的属性列表,使用runtime给分类属性添加set方法时的原理
-
多线程的理解,队列和线程的区别,队列在什么情况下可以开启线程,主线程什么时候会卡死
-
https与http的区别,https自签证书与第三方证书的区别,http转https时xcode中需要做哪些设置
参考:iOS 配置https
-
技术亮点和技术难点
-
如何优化加载时间
-
如何优化视频打开时间
-
OC的根元类有哪些
2019.6.25
第十一家
只招一个iOS,项目用的是swift和flutter,自己不感兴趣。
- 闭包的理解
- swift修饰词
2016.6.26
第十二家
很不错的一次面试经历。面试官的态度很好,从我任职过的公司提了一些个人建议。
笔试题如下

- 修饰词weak、strong、assign的区别?id delegate应该用什么修饰?
- Block用什么修饰?NSArray和NSMutableArray修饰符是否一样?
- 什么情况下会出现循环引用?如何避免?
- 简述UITableView的重用机制,UICollectionView如何自定义布局?有没有试过反向语言布局?
- gcd
写出以上代码的执行顺序以及每次执行前等待了多长时间?并解释一下原因?DispatchQueue.main.async { DispatchQueue.main.async { sleep(2) print(1); } print(2); DispatchQueue.main.async { print(3); } } sleep(1);
面试题如下
-
不同target如何设置不同的推送证书?
-
https编程(涉及握手协议)
-
组件化(项目背景)
-
跨平台(flutter公司正在用)
-
Masonry和RAC的点语法是如何实现的
-
代码埋点(自己使用的埋点可能与面试官理解的埋点有点出入)
-
catetory添加属性的原理
-
加载时间的优化
-
蓝牙模块写入固件的原理
最后这两个问题都是自己在第一家公司的项目中用到的。
-
二维码的生成原理
2019.6.27
第八家
最吸引自己的是组件化和代码评估
笔试题


-
第一题
Student
Student
-
第二题
a1==23
b1==32
a1==32
b2==32
-
第三题
编译报错
-
第四题
运行报错,死锁
-
第五题
该数组其实是NSArray对象,调用addObject:等方法时会闪退。
面试题
-
runloop的作用:保活(循环运行)、睡眠模式(节省资源)
-
runloop的输入源:参考iOS 多线程:『RunLoop』详尽总结
-
组件化理解
-
静态分析工具的使用,参考Xcode之Analyze静态分析
-
是否用Swift实际开发过
-
RN所用的语言
-
bugly的具体使用
参考:iOS腾讯Bugly使用
-
组件化后代码量的变化(可复用)
-
AVCaptureDevice相关
2019.6.28
第十三家
笔试题

-
第4题
a==20
b==100
面试题
- 网络请求的强校验
- 多代理
- 如果让自己从零开始构建一个电商项目,会提前做哪些技术考虑?
第十四家
电话面试
- sting NSString kcfString的区别
- protocol exteren swift中
- 有没有自己封装活framewok或cocoapod
- 是否做过OC和C或C++的混编
- mac检验
- 指纹解锁的实现
2019.7.2
第十五家
第一次接触到app中的商业曝光、三方上报等名词。
面试题
-
git rebase 的作用
-
view和layer的区别
-
layer如何绘制圆角
参考:iOS离屏渲染之优化分析
-
按钮添加触发事件的两种方式(RAC和addTarget)的区别
涉及到iOS8的内存阈值问题,暂时没有查找到相关资料。
-
商业曝光方案
如何统计一个广告在页面上的停留时间。如下图箭头所指的广告cell是否在页面停留了1秒以上。

-
YYKit缓存图片的原理
-
宏定义和常量定义的区别
参考:宏定义和常量定义的区别
-
如何自定义一个View的弹簧效果
HR面试
- 世界上最遥远的距离就是和心仪的工作之间就隔一个HR
- 问的比较多的是之前任职公司的规模、团队组成和app相关(用户量、日活)
- 自我认为与应聘岗位的匹配度
第十六家
面试题是以实际开发需求中遇到的为主。
-
描述delegate产生强引用的情景及原理
-
Router的使用
参考:CTMediator
-
AFNet..在A请求未结束时开始B请求的后果及解决方案
-
SDWeb..中placeholderImage是何时加载的?缓存前还是缓存后?如何修改其加载逻辑?
-
UITableView第一个cell中的Image未缓存(使用SDWeb..)完成时,滑动至其他cell,第一个cell消失,然后再滑回至第一个cell处,上面的图片显示是否正常? 其实我没懂这是什么意思
-
Button超出父视图frame时的解决方法
-
FMDB的使用
2019.7.4
第十七家
笔试题

第一轮面试
-
@property需要注意的三个点
-
MRC时代的set方法怎么写
-
__weak的原理
-
gcd信号量和group
-
load方法
第二轮面试
-
相册开发时如何获取内存配额来释放缓存
-
经典的设计模式(大学时学的)
参考:设计模式
-
有序数组查找的复杂度问题
此次面试过的公司如下(乱序)
- 游盾信息--vpn代理软件
- 斯干--二次元社区平台
- 京东(电话面试)
- 彩贝壳--亲子服务平台
- Vphoto--照片直播类app
- 上海瓶钵--信息安全方面SDK开发
- 小象优品--电商
- 挖财电话面试--D轮融资金融类公司
- 大专家电话面试--医疗类app
- 上海聚鹏--上包工程师
- 返利网--电商
- B站(直播)
- 上海美浮特--自研药品和化妆皮
- 喜马拉雅面试--国内音频独角兽公司
- 乐贝--跨境电商
- 知而行--爱U惠app
- B站(商业化)
- 微汇--移动支付