【揭秘武汉iOS市场】老彭带你全方位探秘iOS面试
No.1:湖北爱尚青果信息服务有限公司
推荐指数:★★★
老彭拒绝理由:中规中矩,来挑战更劲爆的
公司性质:最常见的软件公司
公司地址:武汉市东湖高新技术开发区光谷软件园A8栋一楼右侧
面试邀请来源:51job
面试时间:2016-2-23 上午10:00
面试结果:10K+五险一金
内部环境:
面试过程:
上午9:45 到公司,前台MM给了一张面试情况登记表,花费几分钟填好表格。并且通过面试人员登记表上来看,来面试iOS的还是很少的,近一个星期加上我只有两个人来面iOS,其他都是来面安卓和后台的。
根据之前了解到的信息,武汉的iOS招聘十家企业只有一两家有面试题,于是在我填完表格的半个小时后,前台MM带我进了会议室,两分钟后两个人进了会议室对我进行了技术面试。一个是公司技术总监,一个是目前iOS部门的负责人,有五年iOS开发经验。面试大概进行了一个半小时。
面试记录:
1:笔试
没有进行笔试
2:技术面试过程
首先,两个面试官坐下来,先和他们打了招呼,相互问候了一下。
面试官:你先来个自我介绍吧。
于是我结合我自己简历上写的学习经历还有工作经历按时间线的方式给面试官介绍了一下我的基本情况,因为我上一家公司是在广州,我还特地说了我来武汉工作的原因,让面试官安心一点。等自我介绍得差不多的时候,面试官也基本能看完你的简历了。
自我介绍结束之后,我自己主动打开话匣子
我:我最近做的这个项目,是一个两人项目,也是我第一次当主要负责人来负责一个项目,所以我在上面花的心思很多。它已经上线了,我带了这个项目过来,在我的手机上,你们要看一下吗?
面试官:好的,那我们来看一下吧。
于是我打开app,把我主要负责的模块和职责简单介绍了一下。然后iOS负责人开始在app里面寻找一些知识点来询问我。
面试官:你简历里面说你对这个广告轮播器进行了单独的封装和抽取,可是你这个app里面的图片轮播器并不是无限轮播。
我:是的,这个app里面并不是无限轮播,但是这个是项目经理的要求,所以我只能做成没有无限轮播的,但是我抽取代码的时候进行了改进,已经是可以实现无限轮播功能了的。
面试官:图片轮播器有很多种方法来做,你是用什么来做的呢?
我:图片轮播器可以用scrollView和collectionView来做,在这里我是采用的collectionView来做的,因为这样子可以更加简单地识别你点击的是哪一个item,更加简便地进行传值。无限轮播我是采用一种伪无限轮播的方法,设置一个很大的组数,每一组形成一套轮播广告图,然后一开始让它滚动到中间,这样我测试过,只要用户不在首页停留几个小时,是不会出现问题的。然后内存方面我也做了测试,只是增加了一点内容,不会造成恶劣影响使app闪退。
面试官:可是这毕竟不是真的无限轮播
我:是的,还有另外一个思路就是用三个容器就可以了,只要把里面的item换掉就好了,但是逻辑方面判断就要相对复杂一点,因为当时公司赶进度,所以就采用了上面的方法。(咱们传智的iOS课程里面,两种无限轮播的方法都有讲,大家可以安心地跟面试官吹)。
面试官:不过这样也可以,赶进度的话没有太大的问题。
面试官:我看你这个app里面的cell都是固定行高的,如果iOS7以后碰到cell行高不一样的,你会怎么做?
我:iOS7之后出现了一个属性 estimatedRowHeight,翻译过来就是预估行高,通过autolayout进行cell的计算之后可以通过约束来进行不一样的行高的自动适配,但是如果你cell里面要带图片,图片是从网络获取的话,需要先给他添加一张占位图,这样才能正确地计算出cell的高度,不然的话会造成图片实现不出来。(咱们的微博项目有关于这个方面的详细说明)。
面试官:嗯,不错。(点头,然后继续找寻知识点)
面试官:你这里说到你封装了一些模块出来,你封装了什么?
我:我把首页的这个控制器切换封装成了一个框架(如图),因为一开始我用的scrollView进行这个界面的制作,但是scrollView一开始会把所有的控制器都加载,而不是用到的时候才去加载。所以我想到了利用UIViewController的容器属性,给它添加子容器,让子容器间进行切换,通过计算点击上方item的位置来确定跳转的动画方向,并且可以用到的时候再加载控制器。
面试官:那你做了缓存处理吗?
我:是的,这部分我弄了挺久的,当控制器移出画面的时候,一开始我是用一个字典来保存整个控制器的,但是后来我发现这样很消耗性能,并且这些控制器之间的构建是相同的,我只需要把模型进行缓存就可以了,然后直接加载模型。
面试官:嗯,这个控制器切换的方式挺新颖的,不错。
(然后关于项目方面的大概就是这样,所以大家一定要对自己的项目十分熟悉,保证每一个点牢记于心。)
面试官:那项目部分就到这里吧,关于技术方面,咱们就按你简历上写的一点一点往下走吧。
面试官:你之前学过C++是吧?
我:是的,是在大学的时候学的,不过出来工作两年了,也好久没用了,工作中一般都是用C和OC,然后最近我在自学swift,已经用swift写过几个小项目了,之前我封装的那几个模块也是用swift封装的。
面试官:那你有用过C++在项目中吗?
我:这指的是混编吗?(面试官点点头)没有,我都是用oc写的项目,最多用一下oc和swift混编。
面试官:关于通知、委托和block,说说你的看法,和他们之间的联系。
我:委托就是代理,一般来说代理是一对一的,但是通知是一对多或者多对多的,但是也有例外,也会有多代理的情况。
面试官: 哦?
(在咱们的XMPP项目有有用到多代理的,于是这里和面试官吹了一波多代理相关的)
我:然后在应用场景方面,代理一般用于两者关系比较紧密的对象,因为你需要拿到代理,而通知只要你发出通知,我接受通知,回调就好了,所以通知的两个对象关系不是那么密切,所以一般如果隔了多个控制器,一般不会使用代理,因为需要一层层一直传值,使用通知是一种更好的选择。而一般我会喜欢用block来代替代理进行传值,因为代理比较麻烦,需要遵守协议,设置代理,而block则相对简单。
面试官:这方面没什么问题了,你是怎么获取模型的。
我:底层就是通过运行时遍历拿到对象的成员变量,然后使用kvc进行赋值。
面试官:那你知道YYKit吗?
我:知道,这是去年年底很火的一个框架,是一个中国人写的,他说他的字典转模型效率比MJExtension更快,我也稍微了解了一下这个框架相关的东西。
面试官:你知道为什么吗?
我:这个我不是很清楚呢,没有很深入的去研究,但是外界对他的评价很高,希望您能指点一下我。(如果有问到你不知道的知识点,要趁机向面试官提出疑问,表达出你强烈的求知欲和探索精神,这点对于程序员还是很重要的)。
面试官:因为MJExtension没有对NSCoding进行处理,还是用的原生的,但是YYKit做了自己的处理,所以在这一部分就超越了MJExtension。
我:原来是这样,我回去再去看一下相关的。
面试官:^_^
面试官:你是怎么进行数据持久化的?
我:一般有四种方式:偏好设置(Preference)、NSCoding、SQLite3、Coredata。
面试官:那你用户的登陆信息一般保存在哪个文件夹?
我:一般我保存在document文件夹
面试官:为什么,document文件夹和其他文件夹相比有什么好处
我: document是最常用的目录,iTunes同步应用时同步这个文件中的内容,一般储存重要的数据,而Preference 一般用来保存用户的设置这些轻量级的数据,也会被同步。而其他两个文件夹caches和tmp则不会去同步。
面试官:挺熟练的,挺好
面试官:你做过推送吗?用的什么来做?
我:做过,是用的极光推送来做的,我简历上也有些。
面试官:推送有什么特别的需要吗?
我:是的,具备远程推送功能的app必须具有推送证书(然后我就把推送证书注册的流程大概说了一下,这些咱们传智的课程上都会详细地给同学们演示)
以上差不多就是这次面试的精选。
这次面试的总结:这次的是一家位于光谷软件园的一家小型公司,不算很多,但市面上很多的it公司都是这种规模的,有一两个技术大牛带着一群还可以的人来做app开的工资也就中规中举,也能从侧面反映出武汉iOS的大概行情。