Osheep

时光不回头,当下最重要。

亲历iOS面试题(含答案)整理

喜欢研究新技术,分享研究成果一直是我的追求!

由于自己,公司,城市,行业发展等种种原因的矛盾与瓶颈,终于经过近10天的面试工作,面试10多家公司,获得2.5个offer:成功入驻我的新东家—一家依靠国企的创业型互联网公司。

《亲历iOS面试题(含答案)整理》

未来,前路在何方,就在脚下!

本篇就以本人面试过程中遇到的面试问题,做一分享,希望给iOS行业中的一些金子大牛一点参考,以及推动iOS行业人才队伍的发展!

分享几点深刻的印象:

1.第3天面试:

面试的技术官水平挺厉害的,不像前2天面试的时候,要么是些技术小喽啰在网上随便找些面试题,蒙混过关;要么是刚创业的想找个技术大牛;要么是某某培训机构挂着招聘的名义想找培训人员!现在软件开发这市场真心乱。

记得当时大牛当场出了4道自己工作过程中遇到的4个问题,让我来解决!还好,问题挺难,但因为之前有遇到过,都解决了,虽然当时说的解决方案有个别不是太合适,后来通过网络查找纠正了!而且也竟然顺利通过了,说让下午复试!

下午复试时,才知道是老板直接再次面试,一般这个时候没啥问题,肯定就过了。但老板二次面试这种,个人感觉不太靠谱,还是hr直接二面更好一些,最后我会解释为什么我这样想!当然很重要的原因是老板纠结于0.5k,1k的工资,所以当他说出降点,再降点工资那一刻,其实他在我心里已经被Pass掉了!后面的当然就Game Over了!

自认为这算是得了0.5个offer。

2.第6天面试:

这一天的面试可以说是惊喜连连,也可以说是血雨蒙蒙!

上午的我又遇到了大牛了,这次去的地方,办公条件真心不错!当时刚到的时候就多么希望能有机会留在这办公。但是这次又失算了,因为自己没有准备好,竟然没有意识到人家对我前面所写的技能方面那么关注,

只是一个了解Swift,就问OC怎么调Swift,有什么注意事项;

I/O技术的理解,不就是读写操作嘛,老兄,那么认真,那有什么注意事项,傻逼了吧!

视频,音频数据流延迟怎么处理,原谅我只考虑到了数据先缓存再播放!

就这样,拜拜了,之后下午骑着ofo小黄车在新区转了一大圈,没找到靠谱的公司,就这样时间被浪费了,正在我感叹一下午时间就这样被时间粉碎了,又浪费了一下午!刚回到家,一家公司(现在的东家)给打电话说,有没时间明天上午去公司面试!当他说了地点之后,我说离得这么近,现在去(大概有下午5点半),最后就顺利的去面试了!

还行,这次东家的老大问的技术并不是特别偏的,都是特别适用的,问的得心应手,我回答的也还可以!就这样,走了之后我知道,终于一个offer到手!

3.第7天面试:

当有一个offer即将在手时,自己的自信心将是非常强的,就这样,由于之前约好的,在我一大早,骑小黄,坐地铁,再骑小黄终于到了面试的地点,还别说家乡发展还真大,那边连着有20几栋高楼,瞬间有种深圳南山区科苑路的感觉了!

闲话不多说,直接上代码。哦NO,还是上我的经历吧,去的时候,公司好像还没开门,刚好当时的面试官(后来谈话中知道的)也在旁边。就闲聊了一会,后面进了公司之后,开始正式的面试,当时面试官就和我聊项目,问我介绍下拿手的项目吧!

《亲历iOS面试题(含答案)整理》

达康书记都发话啦!

于是我就开始我的项目开始,经历,遇到的问题,怎么解决,以后怎么避免等。一气呵成!简单谈论下自己用到的其他技术方面,自我感觉回答的还不错!好吧,转到人事这边,就问了你的职业规划,对公司的愿景等。好吧,这个简单谈下自己的想法之后,被告知等通知吧!好吧,我知道肯定又一个offer到手了!


以上是本人面试中遇到的点点滴滴,就当一个日记吧,不喜欢的可以跳过看下面的重点。重点来了,我整理了面试中被问到的相对有一点难度的面试题,总共20道(大部分附个人答案,或者找的大牛们的链接),从简单一些到复杂到非iOS技术方向!

其他如代理和通知的区别,开发中用到哪些设计模式,数据化存储方式有哪些,谈谈你对内存管理的理解,你对线程的理解等,什么assign,retain,weak,strong,copy的区别,或者如

@property ( nonatomic, copy ) NSMutableArray *newArray  这种经典问题的理解等,就不在本篇讨论之内,一方面太简单了,另一方面适用价值不是特别高!

希望各位面试官手下留情,因为我不小心提前泄露题目以及答案了,原谅我吧,因为我知道,以你们的水平,我魔高一尺,你们就道高一丈!

当然,不服,你也可以来打我啊!

一.基本问题:

1.简单说一下你怎么做屏幕适配

一般简单来说我就看界面的复杂度来选择,如果是简单界面直接用StoryBoard或者Xib来处理;如果复杂界面的话,就用比例去定(因为iPHone7出来之后,基本iPhone4,4s的考虑就没那么重要了),所以按比例最快最省事,不过也会用 Masonry 第三方库来适配屏幕!

当然如果需要适配iPad的话,就用Size Class去处理,简单页面可以用,复杂页面还是单独各自适配吧,有坑或者说比较浪费时间,个人感觉!

2.界面布局用到的有哪些库

上面提到的 Masonry 算一个,UIView+AutoLayout,或者 MyLinearLayout和SDAutoLayout ,后2个没怎么用过,希望有时间可以研究下用用。

3.简单谈一下你对I/O技术的理解

对文件读取,写入,更新操作

写入的方法:write data方法

优化,建议写入数据完毕之后再统一调用synchronizefile这样提高效率,减少同步次数

读取的方法:read data to end of file

优化,每次读取数据大小为512kb到4m,不要读太多,提高效率

4.简述MVC的模式的原理,以及它在iOS中的应用

这里先附一个连接:iOS中MVC设计模式,觉得作者讲的非常不错!

在iOS中应用方面:我觉得就是传统的架构模式上,分为2种模式,如下图片所示:

《亲历iOS面试题(含答案)整理》

MVC架构模式实用

如上:左图模式为先业务逻辑,再MVC细分,称其为小MVC架构模式;右图为先MVC模式,再细分逻辑,称其为大MVC架构模式!

而具体实践过程中,以我的一个简单项目架构为例如下:我称其为混合MVC架构模式(即既有小MVC架构模式,又有大MVC架构模式)

《亲历iOS面试题(含答案)整理》

总的来说,在实际项目中运用为简单项目采用小MVC架构模式,复杂项目采用混合MVC架构模式

5.尝试用C语言或其他语言编写一个排序算法

这个就比较简单了,自己试着写写看!冒泡排序和选择排序最常用了!

好吧,还是给拓展一些其他排序算法吧:排序算法详解及OC实现

二.较难问题:

1.iOS中单例模式有什么优势,请写出一个单例!

个人理解:单例模式是iOS中的一种设计模式(iOS中大约有23种设计模式吧)!单例对象在整个应用程序中只创建一次,后面再创建的时候还是同一个对象,而且从单例被创建,直到关闭应用程序都一直存在,这样就可以有以下至少2个方面的用处,如:

1.便于界面的传值,如A界面跳B界面,传统赋值传值只能用于A传值给B,而对于B传值A,常用的要么采用代理,Block等处理,也可以在A里面创建单例对象,跳转到B界面进行相应的数据包装,回头回到A界面拿来用就行了,相当于是解决了其他传值模式的弊端。但不建议用的过多,能用代理,Block来解决的,还是不要用单例来进行传值!

2.真正的它应该作为复杂界面管理者来实现,如我的网络请求的时候封装类库用的就是单例,一次创建完成,包装好需要的基本参数,管你界面怎么跳转,拿来就用,就是这么任性,如系统常用的单例:UIApplication,NSUserDeFaults等,无不都是作为管理者身份去处理应用的!

当然它还有缺点,即自从创建成功开始至应用程序关闭,一直存在占用空间,所以肯定不能创建过多的单例了。在应用程序中,我就见过有的单例创建上瘾了,直接把Controller作为单例创建的,遇到问题,说这数据怎么不会变啊,一直这样,尼玛,自己想去,醉了!

2.你对多线程的了解

我感觉回答要点在于:

常用多线程方案,至少说3个吧,NSThread,NSOPeration,GCD等。最好说下三者的区别以及逐渐进步点,最后现在大家基本都用GCD来处理多线程问题,那就谈谈GCD常见的3种线程创建方式:

dispatch_get_global_queue,dispatch_queue_create,dispatch_get_main_queue.

这些基本差不多了:最后附上一篇多线程讲的比较好的文章

iOS多线程技术方案

3.OC和Swift混编方面

直接上链接了:Swift与Objective-C混编(一)

4.商城界面抢购倒计时怎么与后台时间一直保持一致

这个很简单的,和后台定义2个时间,一个是自己的当前时间,一个是抢购结束的时间(当然最好把二者差值算一个时间戳将会更好),把二者返回过来就能让App当前时间就算不网络请求的话,也能和后台一直保持一致!

5.谈谈你对动画的理解

先附上链接:GeekBand – iOS 动画全面总结

自己做个总结:

1.UIView动画

通过transform等属性设置的动画;

传统的开始,结束动画;

Block式的开始结束动画:

2.(CALayer层)核心动画:(CAAnimation等),以下以一个继承关系图说明都有哪些子类的核心动画

《亲历iOS面试题(含答案)整理》

核心动画父类子类关系图

6.项目中你有用到哪些常用第三方库,有没有尝试封装过第三方库

用过的第三方库就不多说了,我就说下自己封装的第三方库,给自己打个广告,哈哈!

1.里面有我对AFNetWorking的封装的网络请求框架

2.自己对微信和支付宝封装的支付库

7.XMPP返回数据为data格式时怎么区分图片,音频还是视频

方法一:这个我和后台已经商量好了,每次返回的数据都再加一个messageType属性,来区分是图片还是音频什么的;

方法二:先当成图片解析,解析不成功再当做音频解析,依次到视频,效率不高,但也是一种方法;

综上,推荐还是用方法一更好一些!

8.你对单元测试的理解

这个问题其实是在问你关于单元测试,有没有用过,怎么用的,这里我以我使用过的XCTest为例,说一下我使用的流程,最后附一个小Demo!

有这样一个问题,你和后台调试接口的时候,总是出错,但是每次发送网络请求的按钮都处在项目的最深的一层界面。每次后台说,来,小张,我改好了,你测一下吧。你打开App,一层层的点进去,经过(九九八十一层)N层,点了下按钮,后台说还不行。就这样,重复着10次,估计你都疯了,对后台那边!再加上如果中间的某几个界面需要你输入对应的账号和密码,估计你脸都气绿了。怎么解决,我也就给你个建议,试试单元测试(XCTest)呗!

怎么用呢,先下载我的项目我的单元测试用例

先运行起来,运行成功后,进入下图的位置,点击对号后,看着模拟器,静静等待几秒后,感受下最简单的单元测试给您的不同之处吧,这里我让上面的界面跳转工作自动执行了4次,下一篇我会把XCTest的简单使用写篇文章,以供使用!

先附上链接:单元测试_XCTest使用

Ps:上面的链接目前可能还没内容,但本篇文章发布一周内,必然把单元测试的使用办法文章更新出来!

三.大神问题:

1.一个界面9个接口怎么快速显示数据

方法一:尽量把9个接口合并为更少的接口或者一个接口处理;

方法二:在App启动的时候就开始部分接口的请求,减少当前界面的接口压力!

方法三:开更多线程,可以把9个接口当作9个任务,放到 dispatch_group_async 的线程组中,并行处理,当线程组中的最后一个任务执行完毕之后,系统内部会调用 dispatch_group_notify 来通知界面刷新UI操作。 

2.瀑布流卡顿问题如何解决

多线程处理部分如下载图片;cell重用机制;布局的时候用相对布局,不要用绝对布局,减少大量的计算;还有优化TableView的常用方法都可以用来优化瀑布流卡顿问题。

估计还不全,自己查找吧!

3.CoreData原理介绍:

贴地址吧:iOS CoreData数据库之创建详解

4.视频直播中视频和音频数据流延迟怎么处理的

处理办法有以下3个策略:

1.返回的数据先缓存在进行播放;

2.采用断点下载的模式,分段下载;

3.视频和音频数据谁快先缓存谁,然后等另一个慢的数据获得到之后,再一起播放。

5.你用Runtime都做过什么

Runtime是一种黑语法,几乎大部分的常用如设计模式,类的关系等问题,都可以通过Runtime来解决,因为在平时的OC中如创建对象,分配空间等初始化的时候,实际背后操作是转化为C语言底层的Runtime的一套底层API去实现的。

如本地数据解归档,保存的时候用,使用Runtime动态获取对象属性,并保存提高效率,减少代码量!

此外还有如以下2个应用:

1.使用Runtime快速定位到你当前Controller

2.里面有Runtime的系统讲解,挺不错的

四.奇葩问题:(也不算奇葩吧,其实也就是非iOS方向的问题)

1.给一个表,写一个sql语句查询信息如下:

这个表也不附了,只是这个sql问题更多属于后台PHP等语言的范畴,好吧,虽然我们也用,不得不承认,我当时随便写的,估计是错的!

不过,还是应该系统学习这方面知识呢,毕竟,我还有架构师之梦呢哈!

2.你的职业规划以及对公司有什么样的要求和期望

这个简单,就是回答有逻辑就好了,不要东一棒子,西一锤子的。比如第一阶段怎么做,第二阶段怎么做,第三阶段这样的回答!

对公司的要求,其实就是尊重人才的需求,给予我们充分的空间与技能发挥能量就行了!

这里我就不献丑,自己发挥吧!

以上部分面试题答案属于自己写的,还有一部分属于网络查找;如果有错,欢迎广大大牛们指正,相信群众的力量嘛!


最后,回望近几年的个人发展历程,有面试过别人,也被别人面试过;感慨良多!

那就分享下自认为优质公司的特点:

1.是否有五险一金,至少要有五险吧!将决定您的工资能否按时发放,对公司的安全感会更强一些,虽然公司不会跑路、但也免不了会破产或者重组,被吞并吧!

2.是否纠结于0.5k或者1k工资,像菜市场那样讨价还价,将决定您未来能力上涨之后,工资是否可以跟着上涨!

3.二面是人事面还是老板直接面!将决定未来的福利方面是否可以落实。

这三点足够确定一家公司是否是行业内的靠谱公司了,把其他的渣渣公司彻底过滤掉!


以上纯属个人意见,可以参考,但还是希望您有你自己的思考方向!

终于完了,以上历时3天碎片时间搞定,可以过个祥和的周末了哈!

点赞