从事 iOS 研发6年的面经——送给准备跳槽的你!
前言:
今天和大家分享一下,我从事iOS开发6年的面试心得。大大小小参加过不下30+公司的面试,其中不乏BAT、TMD等一线互联网公司,总结一下,发现大厂招聘都有一个共性。
对技术的要求很全面,有些同学认为iOS掌握了基础的UI、网络、内存、多线程等等就够了,其实要想更好的应付iOS的面试,这些是远远不够的。
比如对RunTime底层实现机制、RunLoop的用户态到核心态切换逻辑,设计模式、架构以及框架的考察,再比如,可能是让很多同学头疼的算法问题,然而算法问题是一线大厂的必考内容。所以我们需要学习和掌握的还有很多。
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!希望帮助开发者少走弯路。
在这里和大家分享下我总结的iOS技术知识体系,大致可以分为以下几个部分:
一、UI视图
其中包括事件传递、视图响应、UI布局、绘制、Tableview重用机制的理解等基本技术点,也包括如离屏渲染、流式页面的性能优化、异步绘制、UI渲染机制等偏底层技术的考察。
二、Objective-C语言
其中包括如KVO、KVC、分类、扩展、关联对象等系统实现原理和机制,以及NSNotification、属性关键字等相关技术点的考察。
三、Runtime
可以说是中级以及以上工程师的必备技术要求,面试官往往会考察大家对对象、类对象、原类对象的理解、消息传递机制、消息转发流程、Method-Swizzling、ISA-swizzling、动态方法解析、动态添加方法等。
四、内存管理
可以说是高阶考点,也是难点,中高级及以上无法回避的问题。考察内容基本包括:weak自动置nil、ARC、MRC、自动释放池的实现原理、循环引用、引用计数管理思想等。
五、Block
iOS当中非常重要的OC语言特性,自然也是面试常考点。其中包括截获变量特性、__Block关键字、Block的本质、Block的内存管理和循环引用等。
六、多线程
面试高级考点。iOS常见的多线程技术NSOperation&NSOperationQueue 、NSThread、以及快用烂了的GCD;那么面试过程当中,往往会结合实际代码考察同学们对多线程技术的掌握深度,包括对于常见锁的考察,如NSLock、递归锁、自旋锁、条件锁等等。
七、RunLoop
相信很多同学知道RunLoop可以有事做事,没事休息?面试当中的考察可能要更深入些,RunLoop为什么会有事做事没事休息,系统是怎样实现的。哈哈,是不是有难度了,再比如怎样实现一个常驻线程、RunLoop和线程的关系是怎样的等等。
八、网络
其中包括HTTP相关的中间人攻击、HTTPS的连接建立流程、对称加密、非对称加密、DNS劫持、TCP的滑动窗口协议、可靠传输是怎样保证的,以及TCP的慢启动特点,Session/Cookie的区别等等,这些都是面试中高级岗位必考问题。
九、设计模式
其中包括常见的软件设计原则,责任链、适配器、桥接、命令、单例、策略模式等等,不要告诉我你只是看了几本书,面试官会让你结合实际业务场景,现场考察你对设计模式的运用和理解的。
十、架构/框架
其中包括常见的如怎样设计图片缓存框架、网络框架,客户端的整体架构怎样实现,常见的解耦方式有哪些,多数同学都知道OPENURL是一种解耦方案,那依赖注入这种方式可能iOS的同学会感到陌生,这也是面试官期许的答案。
十一、算法
其中包括BAT、TMD经常考察的有序数组归并、链表反转、字符串反转、大数相加算法思想等等,这部分变化就很多了。
十二、第三方
常见的AFNetworking、SDWebImageView、Reactive Cocoa、React Native等
大厂考察的深度也是令人眼前一亮的,下面列举几个高阶难点问题:
- UI视图的事件传递机制是如何实现的?
- UI绘制原理是怎样的?
- 请利用TableView的重用机制实现一个字母索引条。
- 什么是离屏渲染?
- 什么是ARC? (可能有很多同学还不清楚ARC是编译器和Runtime的协作结果)
- AutoReleasePool的实现机制。(总结一句话:是以栈为结点构成的双向链表结构。)
- 循环引用相关的考察,NSTimer如果重复调用怎样解除循环引用?
- __block关键字是否可以解决循环引用?
- Block的本质是什么?
- Block的截获变量的特性应该怎样解释,Block是怎样产生循环引用的?
- 怎样利用iOS的多线程技术对共享变量实现多读单写操作呢?
- 怎样理解自旋锁? 递归锁应该怎样使用?
- 常见的线程同步问题该怎样解决?
- 怎样解决DNS劫持?
- TCP的慢启动特点是怎样的。
- 你对HTTPS是怎样理解的?
17.给你一个实际场景,让大家现场提出利用哪个设计模式解决实际问题。
- 怎样设计一个时长统计框架?
19.怎样设计一个图片缓存框架?
20.客户端的整体架构实现是怎样的,解耦方式都有哪些?
21.UIView和CALayer之间的关系是怎样的?请从设计原则的角度回答系统为何这样设计?
22.UI卡顿、掉帧的原理是怎样的?
23.请解释一下你对isa指针的理解。
24.你是怎样理解引用计数机制的?(很多人会说什么retainreleasedealloc,完全没有Get到面试官的考察意图)
以上24道面试题,同学们看看自己能回答出多少个?其实我想说有的时候你的答案在你理解是正确的,在面试官看来可能很肤浅(原谅我这么直白。。。) 希望此篇文章对你有帮助!
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!希望帮助开发者少走弯路。
谢谢!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里巴巴基础设施挑战与芯片策略
阿里巴巴集团副总裁周明负责阿里巴巴集团、蚂蚁金服集团,包括阿里云在内的基础设施、基础技术的研发、规划、建设、运营等。周明在2019杭州云栖大会上,深入介绍了阿里巴巴基础设施的挑战以及芯片策略,以下是周明的分享内容文字整理,经编辑。 我从基础架构的规划建设和运营者的角度,谈一下基础设施所面临的挑战,以及从基础设施角度看如何发挥整体的芯片算力及其策略。 首先,阿里巴巴基础设施的现况。阿里巴巴今天已经不仅仅是服务于电商以及蚂蚁金服的金融业务,因为有了阿里云智能也就是把技术作为业务的商业模式,所以我们服务了各行各业,服务企业有上百万家,囊括了互联网、电子政务以及金融等行业和企业。 我们有遍布全球的数据中心,也有百万级规模的在线的生产服务器,是全球前五大的服务器规模。这么大的规模一定就会给带来非常多的挑战,挑战有技术的、也有非技术的,接下来简单讲一下面临的挑战以及做了哪些方面的工作。 首先,我们服务器从10万到100万(百万级),当然今天还没有哪家公司有1000万规模的服务器,千万级规模遇到的挑战肯定是不一样的。当在线生产服务器到达10万的时候,一定要考虑在百万级的时候应该遇到什么样的挑战;同样...
- 下一篇
React新Context API在前端状态管理的实践
11/10号文档资料已全面更新!;《【阿里P7】Android高级教程+BAT面试题》,可复制链接后用石墨文档 App 或小程序打开:【阿里P7】移动互联网架构师进阶高级教程+BAT面试题众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redux来帮助我们进行管理,然而随着React 16.3的发布,新context api成为了新的选择。 一、Redux的简介以及缺陷 Redux来源于Flux并借鉴了Elm的思想,主要原理如下图所示: 可以看到,Redux的数据流其实非常简单,外部事件通过actionCreator函数调用dipsatch发布action到reducers中,然后各自的reducer根据action的类型(action.type) 来按需更新整个应用的state。 redux设计有以下几个要点: 1. state是单例模式且不可变的,单例模式避免了不同store之间的数据交换的复杂性,而不可变数据提供了十分快捷的撤销重做、“时光旅行”等功能。 2. state只能通过reducer来更新,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主