2018年 2019年 ios面试
消息转发
http://yulingtianxia.com/blog/2016/06/15/Objective-C-Message-Sending-and-Forwarding/
面试一共分为4轮,全程手写代码和算法。
一面:自我介绍, 然后问一下手头开发App日活和崩溃率,接着开始问
1. 无痕埋点实现原理,手写方法交换代码;
2. 手写代码使用GCD完成: 先并发下载3张图片, 等3张下载完了再并发下载剩余3张, 这里可以使用dispatch_barrage栅栏来区分任务, 也可以使用信号量;
3. timer是否精准, 怎么使用精准的定时器…
4. runloop监听主线程卡顿: 使用observer监听主线程loop, 结合信号量
二面: 手写代码: log(a), postNotification(log(b)),log(c), 问打印顺序, 这里主要考察分线程和主线程的通知回调是否同步,然后又问了UI卡顿优化的问题;
三面: 考察了隐式和显式动画、如何实现圆形进度条、离屏渲染卡顿底层原理(垂直同步信号) 、事件响应链详细过程、socket建立连接详细过程,最后是手写单链表的反转代码;
四面: 主要考察算法: 手写冒泡排序,常用排序算法的时间复杂度, 以基准数偏移的有序数组的查找值为n的元素,要求时间复杂度O(logn)(这里可以利用二分法查找), 最后就问了一些个人职业发展以及现有团队规模问题, 再然后就是谈薪资…
总结: runloop runtime 常用排序算法 链表反转 查找等问题在面试二线大厂的时候基本是必考的点, 最近找工作的朋友需要多留意~
https://www.cnblogs.com/jgCho/p/11296496.html
1.
阿里巴巴一面问题
-
上来先来一个自我介绍,然后问了一些项目的问题
(略)
-
atomic关键词是绝对的线程安全吗,为什么
肯定不是,atomic确保了操作的原子性,就是指两个线程读写同一个属性,总能获取到有效的属性值,但如果一个线程在连续多次读取一个atomic属性值的过程中,别的线程修改这个值,也是会读到不同的属性值。
-
那在iOS中怎么实现绝对线程安全的加锁机制
我回答了用自旋锁,后面他让我解释了一下怎么实现自旋锁,然后还让我说了一下iOS中的锁:@synchronized、NSLock、dispatch的信号量
-
ARC内存管理
直接问他是不是想问我autoreleasepool,然后就说了autoreleasepool相关的内容。
-
为什么要在block里面强弱引用变换
当self持有block,而在block外面弱化了self时,当进入到block之后有可能会发生self已经被释放的问题,那样就会出现野指针的情况,所以需要在block中对weakSelf进行强化,避免self被释放的问题。
-
针对上个问题追问在block中嵌套block是否需要再做一次强弱变换,为什么
这个没答出来,后面我想了一下,内层block是被外层block中的
strongSelf
所持有的,这个strongSelf
是对外层block中的对象进行强引用,只不过在block过后就会将对象释放掉,所以在内层block中再次调用self
的确是需要对外层block的strongSelf
再进行一次强弱变换的。 -
iOS app启动过程
一开始我以为是问我
appDelegate
中的方法,后面他问我还有没有,我就说需要链接执行文件、动态库、framework等等。 -
系统报错unrecognizedSelector的流程,以及如何利用runtime对这个错误进行避免
第一个问题:iOS调用方法的时候会在对应类中对方法进行查找,如果找不到则会往上对父类进行查找,还查找不到则一直往上直到查找
NSObject
类,还是没有找到的话则会报错unrecognizedSelector
错误。 -
Load和initialize方法区别
+Load
是一定会在runtime中被调用的,在类被初始化的时候调用。+initialize
是不一定会被执行,只有当一个类第一次执行类的一些方法的时候才会被调用。 -
项目里面为什么要重构Model层
(略)
-
有了解过MVVM吗,对ViewModel有什么了解
我说ViewModel就是用来存放不属于Model但是要让UI展示的逻辑的代码,然后能提供更好的测试性。
-
算法题:斐波那契数列优化
剑指Offer有
-
有看过第三方的框架吗
我说了SDWebImage,然后他问了SD的缓存原理。 SDWebImage图片缓存原理
-
有了解过LRU算法吗,让你实现怎么实现
LRU(最近最少使用算法),根据数据的访问记录来淘汰数据。实现我说使用链表,当用到里面某个数据则将这个数据节点拿出来,然后放到链表头部,当需要淘汰数据的时候就将链表尾部数据节点进行淘汰。
-
有什么问题问他
阿里巴巴1.5面
刚面完一面没多久在走路就打电话过来说想让我打打代码。
题目
给定一个字符串,找到最长子串的长度,而不重复字符。
例子
给定“abcabcbb”,答案是“abc”,长度为3。
给定“bbbbb”,答案是“b”,长度为1。
给定“pwwkew”,答案是“wke”,长度为3.请注意,答案必须是子字符串,“pwke”是子序列而不是子字符串。
阿里巴巴二面问题
第二天又打电话过来了,感觉这次面我的不是做iOS开发的
-
自我介绍
-
什么是内存泄漏,instrument中Leak检测内存泄漏的原理是什么
内存泄漏就是应该被释放的对象没有被释放,一直保留在内存当中。第二题不会。
关于第二个问题能找到的相关博客只有这个,但是他说的是allocation的原理。
-
又问了一次ARC
我又说了一遍autoreleasepool
-
循环引用
a强应用b,b又强应用a
-
iOS多线程有没有在debug或者开发中用过
gcd
- 那么让你做一个异步下载图片怎么做
-
多线程重复设置图片问题
一面中SD有相关内容
-
png和jepg在内存中占用的大小哪个多一些
png
-
为什么要重构Model层,重构完之后的架构是怎么样的
重构完之后是MVC
-
那说一下MVC架构
M是Model,V是View,C是controller,model和view之间不能直接通信,需要通过controller来协调,controller可以直接调用model,model的改变通过Notification通知controller,并由controller直接操作view,而view通过action与controller进行交互,controller是view的数据源和代理。
-
那iOS为什么要使用MVC架构呢,小项目直接一个文件写全它不就好了吗?
讲真我好懵逼???然后我跟他解释如果全部都写到controller里面就会让整个controller代码很多,不方便维护,别人接手或者了解这个模块都会变得很困难。
-
看过哪些库
还是SDWebImage,然后追问我SD的缓存机制,还有内存命中率。(我感觉还是想问我LRU,但我当时没想到)
-
数据库有用过吗,索引是什么
我说我用过Realm,索引是用来快速寻找某些值,比如可以根据员工的姓作为索引在一个表中快速找到相关数据。
-
事务是什么
我问了是不是指ACID,他直接就说那就说ACID吧。
A:atomic,原子性,一个事务操作只能成功和不成功,不存在中间状态
C:consistency,一致性,事务必须保持系统处于一致状态,即多个线程进行操作后系统状态要保持一致
I:isolation,隔离性,两个相同功能的事务同一时间只能有一个事务请求使用同一个数据
D:durability,持久性,事务对系统的更改的持久的,不可以回退的。
- 最后也没有让我问问题
阿里巴巴三面
当天晚上又来了一个电话,应该是技术总监
- 项目相关
- 项目遇到的问题
- 为什么要重构网络请求框架
- 重构完有什么改进
- 有自己写过的小控件吗
- 有用到在项目上面吗
- github上有类似的吗
- 相比github上的有什么不同
- OC和swift你觉得有什么区别
- 职业规划
- 目前还有面试哪些公司
- 工作地点在杭州可以吗
- 家庭支持吗
- 有考虑过考研吗
- iOS学习经历
20分钟完了,等通知
阿里巴巴HR面
在下午视频面试
- 自我介绍
- 学习上的经历
- 项目上令你印象最深的点
- 为什么选择阿里巴巴
- 为什么选择iOS开发
- 对1688部门的认识
- 目前还有在面试哪些公司
- 腾讯和阿里选择哪个?为什么
- 评价一下自己的性格
- 工作地点有没有问题
- 对你影响最大的人
- 有没有考研的打算
-
有什么问题问她
(还好我先问了一下是不是最后一面,她说不是,那我就机智的没有谈薪资)
阿里巴巴交叉面
面试官是钉钉的
- 做项目遇到的难点
- 为什么要重构网络请求框架
- 我看你项目经验挺丰富的,在做项目遇到过什么难点吗
- 这个难点给你什么收获
- 成绩
- 大学期间有没有特别佩服的同学
- 评价一下自己
-
有了解过1688事业部吗
其实并没有,然后我绕了个弯说我已经跟HR了解过挺多的了,让他以为我误解了他的意思是他要给我科普哈哈哈哈哈
- 有了解过钉钉吗
- 有什么问题问他
https://dywane.github.io/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E9%9D%A2%E7%BB%8F/
2.
HTPPS大致传输过程
-
客户端发送HTTPS请求,附带自己的加密算法和TLC/SSL版本;
-
服务端接收到请求,发送自己的证书给客户端;
证书中包含了网站的地址,加密用的公钥,以及证书的颁发机构等;
-
客户端收到证书校验证书合法性,如果合法,生成一个随机数,然后使用公钥对随机数加密(当然这个随机数,就是以后数据传输的对称加密的秘钥),同时使用该秘钥对消息进行加密;
一般来说,证书是用来标示一个站点是否合法的标志。如果说该证书由权威的第三方颁发和签名的,则说明证书合法。当然客户端也可以信任不合法的证书。
-
服务端拿到这个随机数,用私钥解密,得到客户端随机生成的序列号,用此序列号加密消息,对比客户端发来是否一致,校验消息是否被篡改;通过后,加密一段握手消息,同时附带消息加密值,发送给客户端;
-
客户端,拿到消息后,同样首先校验消息完整性,然后检查消息是否为握手消息;
-
握手结束后,客户端和服务端使用在握手阶段生成说的随机数以及挑选出的算法进行对称加密传输。
https://mryulong.github.io/2018/08/24/%E9%9D%A2%E8%AF%95%E5%A4%8D%E7%9B%98/#more
2.
国内某电商大厂电话面试
很意外,收到投递简历的邀请,下午 5 点投递,20 分钟后杭州的电话就打过来了,直接说晚上电话面试,很强势。说是要组建一个全新的研发部,要将国内的电商成功模式复制到东南亚,大量招人。
这些大厂的面试确实面试官都会提前准备,如提前下载好你的项目 App,阅读你简历上写的博客中的文章,提问也是由浅入深,从你做过的项目入手,然后根据你的回答情况再提问,主要分为项目经验和 iOS 基础部分。虽然结果也是 gg 了,但今年能收到这些大公司的面试邀请也算是看到了一点希望呢!再努努力也许能够得着!
- 说一下做过的项目中最有难度的一个技术点?
- Google 的 Flutter 的原理有了解过吗?和 RN 的区别?
- 原生 App 中的网页容器?RN 这些有了解过吗?
- Runloop 是什么?你是怎么理解的?
- RunTime 是什么?在项目中具体那些地方用到过吗?
- GPU 渲染和 CPU 渲染的区别?
- tableview 如何做性能优化?
- 平常项目中怎么切圆角?
- MVC 和 MVVM 这些架构模式有了解过吗?MVVM 的双向绑定是怎么做的?
- 安装包瘦身是怎么做的?用到的相关清理工具的原理是什么?
某图片美化公司
该公司海外事业部的技术总监电话面试。没有问到很具体的技术问题,主要是聊了下工作和项目经历,主要有两个问题,一个是项目中最有挑战性的一个技术点,另外一个是项目中遇到过的多线程相关的问题?聊外直接约公司面试了。
二面,三面
- 手写算法实现找出两个视图实例的公共父视图,有则输出,没有则输出nil?
- 手写算法实现找出一个视图所有的子视图?
- 手写算法实现冒泡、条件、选择、堆排序中的一种?
- 代码纠错,一段代码中的纠错?
- tableview 的优化?
- 算法实现一个字符串中最长的不重复的子串的长度?
- 你做过最有技术难点的一个项目?
- 你做过最复杂的一个业务是什么?
算法面试官评价:表现在候选人里面很平均。
技术负责人评价:技术面较窄。
某南极动物厂电话面试
首先,非常感谢以前公司的老大帮我内推简历,于是在某一个晚上如愿收到了相关技术部门打来的面试电话。
面试结果过当然是没过了,一方面个人能力确实有欠缺,达不到人间的要求,另一方面,也确实没准备好,无准备之仗肯定是要失败的,面试官挺厉害的,能够根据一个知识点由浅至深一步一步提问,又问到的问题大概有:
- 加载大量内存怎么优化?
- 说一下 http 的状态码?
- 怎么切圆角?
- Sd webimage 的缓存清理策略?
- load 和 initialles 方法的区别?
- 连续动画怎么做?
- 清理多余图片资源使用的工具的清理原理是什么?
- 全景图原理是什么?
- 用过什么系统的原生库吗?
- coredata 用过吗?
某智能家居上市公司
还是有点收获的,虽然不多。
- 一串二进制中取中间三位二进制的最优代码?
- 列举栈和队列在实际开发中的使用场景?
- 本地数据持久化使用过吗?怎么做数据迁移?
- 画出最近一个项目中登录的时序图?
- 画出分页请求的时序图?
- OC 原生支持多继承吗?有什么方案可以让 OC 支持多继承?
- 原生和 JS 之间的交互遇到过哪些问题?
- 使用 pageSize 字段处理分页重新刷新一下把原来的数据覆盖掉这个怎么处理?
- 登录授权过期怎么处理?维护登录态?
某社交/金融/在线教育创业公司
收获很多,面试官很厉害。
- 说一下 OC 消息发送流程?基于这个流程可以做哪些事情?
- frame 和 bounds 的区别?修改父视图 bounds 的 origin,对子视图有什么影响?
- UIView 和 CAlayer 的区别?
- 描述响应链条的过程?经过了哪些关键的方法?
- 有 10 个下载请求,如何控制他们的先后顺序?有哪些方案?
- GCD 的栅栏函数有了解吗?有什么作用?
- 如何判断队列是否是主队列?
- GCD 中的 targetQueue ?
- GCD 定时器相比 NSTimer 定时器的优势?
- GCD 的 source 用过哪些?
- GCD 中信号量的使用有哪些?
- 知道 iOS 中锁有哪几种吗?自旋锁是什么作用?
- Swift 中 open 和 public 关键字的区别?
- swift 中的操作符有哪些?map 和 flapMap 的区别?
- KVC 如何存储结构体?