面试是职场中必经的一个步骤,在短短的几十分钟内去考察一我的的各项能力与综合素质,判断候选人与团队和团队匹配程度。从技术角度来看,面试更像是针对某些知识的讨论,寻求面试官和候选人的知识共通点,从而判断候选人是否知足团队须要。一个恰当的面试不是要难倒候选人,而是要引导候选人展现长处;从候选人熟悉的内容入手,考察技术细节和背后思考。 本文便谈一谈我对iOS面试的一些思考。面试
iOS的面试大体包括三大部分:基础知识、项目经历、代码考察。数据库
基础知识能够分为: a.计算机基本知识:网络原理、操做系统、编译原理、数据结构、数据库等; b.平台相关知识:OC基础、Runtime、内存管理、RunLoop、多线程、Xcode等;编程
项目经历指的是作过的项目以及特定知识的积累,包括Crash分析、性能优化、持久化、代码架构、Pod化、模块化、组件化、持续集成等。设计模式
代码考察是观察候选人在遇到问题如何理解题目、分析问题、实现过程,一般一些解题思路有贪心、动态规划、数据结构、递归、二分、排序等。浏览器
为了切合iOS面试的主题,面试官一般都会从这一块知识开始入手。OC的知识很是庞杂,有时候遇到熟悉的内容就很了解,若是没有接触过可能就没有印象。好比说:viewDidLoad
的触发时机是发生在何时?以及延伸的问题,viewDidLoad
与loadView的关系以及前后顺序。性能优化
因此这部分知识,更合适问一些基础、共性的问题。好比说:微信
ARC和MRC,iOS开发者须要对两种内存管理方式都熟悉。一个了解MRC的开发者,遇到CF开头的函数怎么办? 很常见的面试切入点是从ARC的实现原理开始,引入__strong/__weak/__unsafe_unretained/__autoreleasing
多个关键词的区别,再联想到循环引用,block实现原理,block持有外部的局部变量,autoReleasePool的使用,autoReleasePool与MRC的autorelease区别。markdown
以上是几点是对基础知识的一个简单梳理,虽不全面也能提供一个学习方向。网络
面试中遇到不会的知识点是很正常,只要能把本身所了解的知识彻底表达出来就很好。
有两个亮点能够培养:
一、广度,方方面面的知识都涉及,特别是基础知识要很牢固;
二、深度,对常见问题能深刻学习,经得起三、4次追问;数据结构
项目是能力的体现,实际项目中遇到的问题,能够分为几大类。
性能测试是优化的前提,如何发现存在的性能问题?
数据库是App必不可少的组成部分。
这是很是重要的一部分,没有处理过Crash的iOS工程师,怎么让人相信其能力?
这是很是很差考察的一个方向,但一样要有所准备。
根据每一个人的工做经历,能够挖掘本身进阶部分的知识点:
简单的以LeetCode为标准,大部分公司的要求是在easy难度,进阶要求也只到medium难度。
实际面试过程当中,多是长时间没有作面试题而且没有事先准备,也可能恰好考察到思惟盲区,能顺利完成easy难度的题目都是百里挑一。
作题并非为了把题目解决,而是从作题过程去分析思考面试者遇到问题是如何思考解决,以及可否把代码用实现想法。
选择性针对某些考察点去用对应题目也是一种方向,好比说: 一、对于一个整数m,计算其二进制表示有多少个1,并分析其复杂度;
二、计算1~1000中,有多少个数字7;
三、有两个很大的整数是用字符串来表示,实现一个函数加法,输出这两个字符串数字相加的结果;(大数加法)
...
分享一些作题要点:
一、快速理解题意,对于不清楚的条件及时提出疑问;
二、三思然后行,先分析题目考察点,再进行方案分析,最后作复杂度分析;
三、先讲思路,再进行coding;
理想结果:
一、思路顺畅,实现过程简单清晰;
二、边界处理完善,考虑周全;
三、代码可读性强,具备必定的抽象和扩展;
每一个面试官的经历不一样,所擅长的方向也不同。
求职者会海投,而公司招聘也是海选,面试官的面试也会比较多。若是面试中能有部分知识在深度或者广度产生亮点,能够给面试官留下深入的映象,从而更容易经过面试。
从个人视角去看iOS,把一些常见知识点给列出来:
题目只是一个引导,有经验的面试官每每会追问更深层次的问题,做为一个知识深度的考察。在根据上面的知识点去查漏补缺时,能够适当选择一些模块,更深刻地去了解具体的实现。
好比说:ARC/MRC => weak/strong 区别 => 循环引用 => weak实现原理 => runtime源码,不断追问本身其中的实现,直到网上查不到资料。