iOS面试小结

前言

面试是职场中必经的一个步骤,在短短的几十分钟内去考察一个人的各项能力与综合素质,判断候选人与团队和团队匹配程度。从技术角度来看,面试更像是针对某些知识的讨论,寻求面试官和候选人的知识共通点,从而判断候选人是否满足团队需要。一个恰当的面试不是要难倒候选人,而是要引导候选人展示长处;从候选人熟悉的内容入手,考察技术细节和背后思考。
本文便谈一谈我对iOS面试的一些思考。

正文

iOS的面试大致包括三大部分:基础知识、项目经历、代码考察

基础知识可以分为:
a.计算机基本知识:网络原理、操作系统、编译原理、数据结构、数据库等;
b.平台相关知识:OC基础、Runtime、内存管理、RunLoop、多线程、Xcode等;

项目经历指的是做过的项目以及特定知识的积累,包括Crash分析、性能优化、持久化、代码架构、Pod化、模块化、组件化、持续集成等。

代码考察是观察候选人在遇到问题如何理解题目、分析问题、实现过程,通常一些解题思路有贪心、动态规划、数据结构、递归、二分、排序等。

一、基础知识

1、Objective-C基础

为了切合iOS面试的主题,面试官通常都会从这一块知识开始入手。OC的知识非常庞杂,有时候遇到熟悉的内容就很了解,如果没有接触过可能就没有印象。比如说:viewDidLoad 的触发时机是发生在什么时候?以及延伸的问题,viewDidLoad 与loadView的关系以及先后顺序。

所以这部分知识,更合适问一些基础、共性的问题。比如说:

  • 常见的property有哪些属性?各自的属性应用场景有哪些?
  • 介绍KVO和KVC的区别?KVO是否会引起循环引用?如果观察对象已经释放,会导致什么现象?用NSNotification 替代KVO,观察对象已释放会如何?如何手动实现KVO?
  • 如何创建一个字符串常量?在.h声明并且实现会有什么问题?
  • category和extension的区别?category的实现原理?extension是否可以和category写在同一个文件?
2、内存管理

ARC和MRC,iOS开发者需要对两种内存管理方式都熟悉。一个了解MRC的开发者,遇到CF开头的函数怎么办?
很常见的面试切入点是从ARC的实现原理开始,引入__strong/__weak/__unsafe_unretained/__autoreleasing多个关键词的区别,再联想到循环引用,block实现原理,block持有外部的局部变量,autoReleasePool的使用,autoReleasePool与MRC的autorelease区别。

3、Runtime
  • Runtime机制介绍;
  • 介绍isa、属性列表、方法列表、协议列表;
  • 消息传递机制如何查找方法;
  • Category实现原理;
  • method swizzling原理;
  • imp和selector;

4、RunLoop

  • unloop概述;
  • 与线程的关系;
  • 与FPS的关系;
  • RunLoop的实际应用;
5、iOS系统
  • 介绍scheme原理;
  • 微信如何实现呼起第三方app?网页又如何呼起APP?
  • Push通知实现原理?客户端A直接向客户端B发Push是否可行?
  • 代码签名;
  • 沙盒机制;
  • 地址空间随机化;
6、编译原理
  • 介绍整个编译的流程;
  • 静态库、动态库的区别;
  • 静态连接、动态链接的过程和区别;
  • 在VC.h文件引入VC+Test.h(Category)会如何;
7、多线程
  • 多线程有哪些实现方式 ?
  • pthread、NSThread、GCD、NSOperationQueue有哪些应用场景?
  • 多线程如何进行线程同步?
  • 信号量、锁、代码块、原子变量常见有哪些应用场景?
  • 实现一个变量的读写锁:读共享,写互斥;
  • 如何用GCD实现100个任务执行,但是最高并发为10个任务?
  • GCD和线程的关系?GCD并发队列的线程爆炸?
8、网络原理
  • 介绍TCP三次握手?
  • socket编程中,何时进行三次握手?如何用socket发送数据?
  • HTTP协议中request和response有哪些数据组成部分?
  • 在浏览器输入URL到页面加载发生了什么?
  • HTTP断点续传;
  • HTTP中间人攻击;(重点)
  • HTTPS实现原理;(加密通信原理)
  • HTTPS中间人攻击;
  • DNS劫持;
9、Xcode
  • LLDB调试技巧:如何查看堆栈、修改内存、监控内存值变化、执行语句;
  • Xcode中的scheme配置是什么?
  • General中的Project和Target用处?
  • Certificate、Provisioning Profile、App ID的关系;
  • Image Assets Catalogs是什么?

以上是几点是对基础知识的一个简单梳理,虽不全面也能提供一个学习方向。
面试中遇到不会的知识点是很正常,只要能把自己所了解的知识完全表达出来就很好。
有两个亮点可以培养:
1、广度,方方面面的知识都涉及,特别是基础知识要很牢固;
2、深度,对常见问题能深入学习,经得起3、4次追问;

二、项目经历

项目是能力的体现,实际项目中遇到的问题,可以分为几大类。

1、性能优化

性能测试是优化的前提,如何发现存在的性能问题?

  • 怎么监控FPS降低?如何监控内存、CPU、GPU、加载速度、磁盘、崩溃等等;
  • 如何进行电量优化?
  • Xcode 有哪些工具可以进行检查?
  • UITableView如何进行优化?
  • 图片加载/下载的过程?怎么优化加载速度和内存占用?
2、持久化

数据库是App必不可少的组成部分。

  • 常见的数据库有哪些选择?
  • 如何处理数据库的版本迁移、损坏保护、体积控制、大小统计?
  • 序列化和反序列化;
3、Crash分析
  • 崩溃日志的地址如何还原成代码?
  • 举一个最近遇到的崩溃,如何发现、定位、解决;
  • 常见Crash类型有哪些?

这是非常重要的一部分,没有处理过Crash的iOS工程师,怎么让人相信其能力?

4、代码架构

这是非常不好考察的一个方向,但同样要有所准备。

  • 常见的设计模式有哪些?举个具体应用例子;
  • App的网络层如何设计?任务并发、回调处理、任务取消等;
  • MVVM是什么?有什么特点?
  • MVC框架怎么保证VC代码不膨胀?
5、进阶知识点

根据每个人的工作经历,可以挖掘自己进阶部分的知识点:

  • 逆向;
  • Pod库实现组件化;
  • 跨平台:ReactNative、hybrid封装、jsbridge;
  • 持续继承CI:脚本能力,工程理解;
  • 质量体系:各种监控,实时告警处理;
  • 音视频相关:AudioUnit、OpenGL ES、GPUImage、Metal、AVFoundation;

三、代码考察

简单的以LeetCode为标准,大部分公司的要求是在easy难度,进阶要求也只到medium难度。
实际面试过程中,可能是长时间没有做面试题并且没有事先准备,也可能刚好考察到思维盲区,能顺利完成easy难度的题目都是凤毛麟角。
做题并不是为了把题目解决,而是从做题过程去分析思考面试者遇到问题是如何思考解决,以及能否把代码用实现想法。
选择性针对某些考察点去用对应题目也是一种方向,比如说:
1、对于一个整数m,计算其二进制表示有多少个1,并分析其复杂度;
2、计算1~1000中,有多少个数字7;
3、有两个很大的整数是用字符串来表示,实现一个函数加法,输出这两个字符串数字相加的结果;(大数加法)
...

分享一些做题要点:
1、快速理解题意,对于不清楚的条件及时提出疑问;
2、三思而后行,先分析题目考察点,再进行方案分析,最后做复杂度分析;
3、先讲思路,再进行coding;

理想结果:
1、思路顺畅,实现过程简单清晰;
2、边界处理完善,考虑周全;
3、代码可读性强,具有一定的抽象和扩展;

总结

每个面试官的经历不同,所擅长的方向也不一样。
求职者会海投,而公司招聘也是海选,面试官的面试也会比较多。如果面试中能有部分知识在深度或者广度产生亮点,可以给面试官留下深刻的映象,从而更容易通过面试。

从我的视角去看iOS,把一些常见知识点给列出来:

题目只是一个引导,有经验的面试官往往会追问更深层次的问题,作为一个知识深度的考察。在根据上面的知识点去查漏补缺时,可以适当选择一些模块,更深入地去了解具体的实现。
比如说:ARC/MRC => weak/strong 区别 => 循环引用 => weak实现原理 => runtime源码,不断追问自己其中的实现,直到网上查不到资料。

最后也分享下自身经历:

  • 第一次当面试官是在做直播时候,在当时直播热潮下,我们产品DAU破60w大关后(虽然量不大,但对于创业团队来说不容易);岗位放出去后,第二天就收到过百份简历,这也从侧面表明16年的时候iOS真的很火。当时做面试官没有主见,从网上抄了一些大厂的面试题;面试过程也是对着题目,照本宣科问再根据回答打个分,不能很好和候选人沟通;
  • 第二次当面试官是帮朋友招聘,以前公司的技术中心负责人出去创业(做交易所),后台研发团队也全部是认识的朋友,但是没有客户端;由于刚从上海来到深圳并不想再回去,我并没有选择加入,但也帮忙面试一些候选人。这几次都是视频面试,借鉴了一些TX的能力矩阵和面试题来问,再加上自己的能力也有所提升,这次勉强达到了识人的门槛;
  • 第三次当面试官是在TX,当时iOS团队经过几番迭代,人员不足急需补充新鲜血液,而我在团队中能力有所体现并负责了一块业务,在团队的信任下也开始面试一些候选人。第一次在大公司去面试别人是挺兴奋的事情,特意做了一些准备,也就是我上面发的做的这张图。对自己所擅长的知识进行梳理,面试的时候也会从其中挑选几块方向进行考察,到此面试也算轻车熟路;
  • 第四次当面试官是在字节,现在已经工作比较长的时间,iOS各方面的知识都有所了解,即使遇到没接触过的知识也能够有一些判断,对面试慢慢就习以为常;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345