跑到郑州的iOS培训班那儿去招人,面试有着刚毕业的十几个学员,感受是挺错综复杂的,有的人简历看着美观但刚一询问就不行了,有的人基础知识很扎实然而不懂得自我包装。在这篇文章当中,我会把面试期间的真切感受,经常会问到的面试题目,以及对于简历和算法的看法都撰写出来,期望能够对正在寻觅工作的iOS开发新手有所助益。
不少人的简历热衷于陈列学校期间斩获的种种奖学金数额、参与多次各类赛事详情清单。不过据我们眼里秉持实用主义的这个公司而言,具备宝贵价值的是当事者的就业履历以及项目实践经验情形。郑州当地的一家从事互联网业务的公司负责招聘工作的人员跟我讲过,他们在对简历实施筛选操作时首先关注瞅看的是求职者最近从事的那份工作具体完成了何事,采用动用了何种技术工具集合。要是你拥有在GitHub平台存在有自己放置的开源项目或者技术阐释传播网络日志记录,那获得的对人的好感程度会显著明显地得以增添攀升。但却要郑重提醒告知一声,前往参加面试之前务必要将你所拥有的开源代码整理得井井有条干干净净。我们确实会就逐个文件去 review 你的代码,命名合规与否,注释明晰与否,甚至中英文之间有无添加半角空格这般细节,均可从中看出你的代码风格以及做事态度。
同样重要的是简历的排版,不少人提交的PDF简历里,中英文是挤在一起的,段间距是忽大忽小的,给人的第一印象是这种简历不够认真,郑州这家培训机构的一位讲师跟我讲,他们学员中拿到offer的那些人,简历平均修改了5遍以上,条件允许的话,面试时带上Mac电脑和项目源码,手机里提前装好简历上写到的所有App。前来面试的人,要是被面试官要求当场进行演示,以及对某个小功能作出修改,能够马上开启 Xcode 去操作,其这般具备十足准备的态度,本身便是极为显著的加分要点。

iOS日常开发里,确实极少会有需要自身去撰写繁杂的排序或者查找算法的情况。多数时候都耗费在搭建页面、编写业务逻辑、调试网络接口上。正因如此郑州这边的培训机构于教学时也不会把算法当作重点。然而我们最近连续几次面试已着手增添一些简单的算法题,主要目标是要考察面试者的逻辑思维水平。例如会让去手写一个可以进行数组去重的代码、或者去判定一个字符串是不是回文。这些题目难度不算大,不过却能够迅速筛选出那些仅仅是会背诵API的人员。
就我个人而言给出的建议是,基础算法方面不必刷过多的LeetCode,然而常见的数组操作、字符串处理以及简单的递归是必须要掌握的。在我们进行面试期间碰到过一个人,其简历上写明熟悉数据结构,可让他去写个二分查找居然花费了十分钟还没写正确。这可真是相当尴尬的情况了。算法题更像是一道起到开胃作用的菜,并非是为了将你难住,却是为了在紧接着的基础问答开始之前,先进行一下热身,以此查看你的代码习惯以及思考过程。
面试之时考察iOS基础,我尤为喜欢去问property相关的问题,一般而言我会率先发问,ARC情形下要是不进行显式指定任何属性关键字,那默认的关键字总共是哪一些。有很多人都没办法回答上来strong和atomic乃是默认的,紧接我就会进一步追问synthesize合成实例变量的规则。假设属性取名为foo,在类当中已然存在一个名为_foo的实例变量,那么系统会不会依旧自动合成新的变量呢。给出的答案是会的,然而会上报一则警告,这是由于两个变量名产生冲突了。

再往更深入的方向去探究,当具备了自动合成属性的实例变量以后,synthesize 还存在着哪些运用场景呢,比如说你期望给属性设定一个不一样的实例变量名称,又或者在协议里声明的属性需要手动进行 synthesize 操作。另外,在 objc 当中向一个 nil 对象去发送消息会出现什么样的情况呢,答案是返回 nil 或者 0,并不会导致崩溃。这是由于和 objc_msgSend 函数的设计存在关联,在消息发送的时候会先检查接收者是不是 nil。倘若对象不能够对某一方法作出响应,那么就会引发unrecognized selector异常,此异常实际上是于转发机制将所有步骤都执行完毕之后才被抛出的。
并非所有参与面试的人都得熟知runtime及runloop的底层具体详情。郑州iOS培训的多数结业学员所从事的皆是日常业务方面的开发工作,其八成的时间都用于处理UI、网络请求以及数据展示。然而我们的确会为那些表现极为出色的面试人员准备一些有关底层的题目,以此来探测他们能力的上限。比如说运用Runtime Associate方法关联起来的对象,在主对象处于dealloc状态时是否需要手动去进行释放呢?不需要的是答案,主对象销毁之际关联对象会自行释放。又比如说,编译后所得的类里能不能增添实例变量呢?不行,因为内存布局已然确立了。然而运行时创建的类中是能够添加的。
关于timer相关的问题,也常常被问询。以scheduledTimerWithTimeInterval这种方式触发的timer,在滑动UITableView之际,为何会暂停回调?原因在于,滑动之时,runloop切换成了UITrackingRunLoopMode模式,而默认状态下的timer,仅仅被添加至DefaultRunLoopMode之下。解答的办法特别容易,只要将timer放置到CommonModes当中就可以了。对于autorelease对象进行释放的那个时间点,在没有手动去填入autoreleasepool的情形下,它会于当前runloop迭代完结之际予以释放。这些处在较低层次的知识平常确实没办法用到,可是在面试的时候能够回答出来的那些人,我们一般会给出更高一些的评级句号。
就多数iOS岗位言,熟练去构建UI乃基本功力所在。郑州这边诸多的公司都运用Interface Builder以及AutoLayout ,严重依赖可视化之布局。于面试之际 ,我们会寻觅一位面试者自身做过的页面,令其剖析页面之结构 、约束的连接方式以及计算方法。比方询问他这个按钮缘何采用centerY而非顶部对齐 ,又或者询问于屏幕适配时约束优先级应怎样去设置。如若面试者依旧在持续坚持以纯代码方式去撰写布局,这也是没有问题的,然而最好能够展现出乐意去学习新型工具的那种态度。

UITableView差不多是必定会遭问到的内容,常用的代理办法里delegate和data source有哪好些呀,cellForRowAtIndexPath以及numberOfRowsInSection是最基础性的嗯,heightForRowAtIndexPath和又常常会被用到个didSelectRowAtIndexPath。动态Cell高度计算,是常见考点,iOS 8之后,能用self-sizing自动计算,也能用heightForRow手动算。还将会随意找寻一个手机里的App,像美团或者微博这般,随机点开一个页面,让其当场讲讲要是自己来写,该使用哪些UI组件以及何种布局方式。这种实战题,最能够瞧出一个人的真实水平。
有关于设计模式方面,若面试者自身感觉还挺好的话是能够聊一聊的。可是拜托各位千万别再仅仅提及 Singleton 了,用的次数越多我们对您的水准就越心存疑虑。单例被过度使用会致使全局状态变得紊乱、不易于进行测试。真要是去聊设计模式,我会提出一个具体的问题:抽象工厂模式在 Cocoa SDK 的哪些类当中有体现呢?比如说,NSNumber的numberWith...系列工厂方法,或者UIStoryboard的storyboardWithName方法,这是一方面。至于架构模式,MVC、MVVM、MVP,针对这几种模式聊各自的见解即可,不存在标准答案。但是,千万别说出“网络请求和数据库操作应该放在UIView的子类里”这种离谱的话语,这是需要注意的。
除去iOS开发之外,我们 additionally 也会顺势问一下别的编程语言或者脚本语言焉。对Python用于做工具链熟悉,对Ruby用于做自动化打包熟悉,对负责Shell脚本处理日志熟悉,好多这些都是颇具实用价值的技能。甚至对于怎么翻墙我们同样会问一问,虽说不正规,然而能够看出个人获取技术资料有的能力。在郑州这儿的iOS培训学员要是能够主动去学习终端操作、Git高级用法、正则表达式等等这些周边技能,面试官怀有好感的程度会显著更高。人人皆是从事写代码工作的,没必要凭借出偏题怪题去刁难他人,更为关键的是性格能不能合得来,团队协作沟通能力是否够强,这些常常比技术自身更为要紧。
问下大家最后的一个问题:当你在面试iOS岗位之际,碰到让你最会感到措手不及的面试题是什么呢?欢迎于评论区去分享你的经历,要是觉得这篇文章是有用的话,可别忘了去点赞并且转发给正在寻觅工作的朋友哦。