基本情况
- 本人从七月下旬开始实习跑路,回到学校准备秋招,一开始海投了大概四五十家公司,前期收到面试的公司基本都收到了意向书或offer,包括阿里,百度,猿辅导等等。fail掉的公司为腾讯,二面挂后转岗到腾讯北京,后放弃面试。后决定好自己去向之后基本没有再继续面试,也推了十几家公司的面试邀请,包括美团,贝壳,快手等。个人秋招在八月下旬基本结束,现在希望把自己在秋招的面试经验总结出来,帮助更多的小伙伴。
通用必备基础知识
- 抛开iOS 开发这一项技能,我们最基础的本质还是一名软件开发工程师,所以基础的部分必不可少,本篇面经中,不会具体总结出每个公司每一面具体考的内容,而是会根据不同的知识点将面试真题分为不同的专题部分来具体分析。
计算机网络
对于大前端类,计算机网络主要考量的还是传输层和应用层部分的知识。
浏览器输入url到网页显示经历了什么过程?
TCP三次握手:具体是怎么握手?为什么要三次握手?两次行不行?为什么不行?三次握手,第二次和第三次分别因为什么?
TCP是如何保持可靠传输的(拥塞控制,慢启动等等概念的理解)
TCP为什么要四次挥手,TIME_WAIT为什么至少设置两倍的MSL时间?
TCP三次握手的详细数据传递,四次挥手详细数据内容,数据包组成、TIME_WAIT状态,2MSL,RTT,重传、滑动窗口、拥塞原理等等
TCP、UDP面向连接、无连接具体理解,他们的区别,如何将 UDP 改造成和 TCP 功能相似
TCP/IP四层协议,OSI七层协议,每层都有啥对应的协议,原理是啥
http报文结构,http中超文本超是啥意思,http请求的组成
http 报文头部含有什么,multipart了解吗
http的状态码,200,304,301,http请求报文,响应报文
get和post请求的区别?什么情况下用到?POST传输的数据都有哪些格式呢(这里需要搞定http各种请求传输的数据格式)
描述一次完整的http请求
什么是cookie,什么是session,区别联系,cookie的本质是什么
http1.0,1.1,2.0的区别
https有几次握手和挥手?https的原理。http有几次挥手和握手?TLS在哪一网络层,基本原理是什么?
https与中间人攻击
HTTPS,安全层除了SSL还有,最新的? 参数握手时首先客户端要发什么额外参数
HTTPS是什么?握手过程,SSL原理,非对称加密了解多少
证书是干什么用的
算法
- 剑指 offer 上面的题目都是面试过程中的算法高频题,特别是二叉树和字符串,栈队列,链表,跳台阶问题一定要弄懂并且熟练。
- 八大排序算法的复杂度,概念,最好最坏情况,手写都是必须要掌握的,其中的重点是快排和堆排序,对于快排的优化,快排的基础原理,系统 API 快排的实现原理等都是必须要掌握的基础知识。
- 二分查找在面试过程中也比较常见,因为比较简单,包括二分查找的变种。
- 二叉树的前中后序的递归与非递归遍历方式,以及层序遍历和蛇形遍历都是重点。
- 海量数据如何找到重复次数最多的那个 优化
- 海量数据,但是都是1~100之间的,如何找到重复次数最多的那个
- 面试算法题一般不难,掌握技巧很重要。二叉树相关的算法题基本都要往二叉树的遍历上靠,链表相关的算法题基本都要往额外的“帮助指针”上面靠。
数据结构
- 在面试过程中这一类主要是和算法来一起考,数据结构一般主要会问栈与堆的区别,栈与队列的区别等等,在前端的面试中,红黑树这类的很少被问到。
编译原理
- 主要需要了解程序的编译过程的基础概念就OK。
操作系统
- 操作系统老生常谈的就是进程,线程的概念和区别,几个状态,以及他们的调度方式,通信方式,保持安全等等知识点,基本面试都会被考到一点,这一部分需要牢牢掌握,实在理解不了就背下来。
- 说说递归和普通的循环方式有什么区别
- 计算机存储系统是指?哪些存储系统能提高程序执行的效率?
- 段错误和栈溢出分别在什么时候会出现,为什么
- 其他方面的包括页置换等等基础知识,知道概念就OK,在前端面试过程中这部分不是特别重点考量的点。
数据库
- 数据库这部分也比较简单,主要就是 ACID 等基础概念,几大范式,简单的 sql 语句。
设计模式
- 工厂方法,抽象工厂,简单工厂的区别和联系
- 装饰者
- 观察者
- 代理模式等等
概率论
- 三门问题
- 红黑球等等常见问题百度即可
Linux
- 主要包括基本的 shell 编程,基本的脚本命令,重点是 grep,ps,top,free等
版本控制
- 版本控制主要包括 Git 和 SVN
- git 的基础概念,基本命令,包括 merge 和 rebase 的区别等。
- Git 和 SVN 的区别,异同点
- 平时开发中,版本控制的流程是怎么样的
通用语言基础
- 面向对象的多态。多态的几种方式
- 各个语言中的单例模式
- 内存管理方式
- static 和 const 的作用和区别
- C 语言的内存分段
iOS专业知识点
- iOS 的面试过程中,虽然知识点很多很杂,但是老生常谈的还是那些比较陈旧的知识,只要对他们有较好的理解,通过面试一般不成问题。
内存管理
- ARC 和 MRC 的区别
- 属性的关键字,他们具体的底层实现以及区别,被问烂的知识点包括 copy, 浅拷贝和深拷贝的区别, weak 的底层实现。稍微新颖一点的 assgin 和 weak,unsafe_unretained 具体有什么区别,assgin是否可以用来修饰对象。这一部分是面试必问,一定要弄懂。
- Autorelease pool的底层实现原理,与 Runloop 的关系, autoreleasing 关键字。
Block
- 本质,基础概念
- 使用时要注意的地方
- block的实现,如何截获自动变量的,如何修改自动变量的值的,block的几种形式
- __block的本质
- forwarding 指针
- block怎么避免循环引用。是不是所有的block都会产生循环引用,block里面怎么避免被提前释放
多线程
- iOS 中多线程的几种方式,区别,使用场景,基本概念,同步异步,串行并行的区别。
- GCD,写一个死锁,并行和串行队列,同步和异步的区别,GCD怎么控制最大并发数
- 怎么让子线程定时执行一个方法,具体的实现方法
- 如何控制线程的最大并发数为10,然后加载十个图片最后展示出来,具体方法
- 子线程的runloop是怎么执行的,它里面的 autoreleasepool 是怎么执行的。
- NSMutableArray 怎么保证线程安全的。
- GCD怎么避免block中的变量被提前释放
Runtime
- 消息的动态转发
- 给 Category 添加属性,关联对象都有几种形式
- method swizzling
- 说一说类的结构,运行时中的class都有什么属性,property都有什么属性
- 说一说isa指到NSObject的那个过程
- Category的本质,load方法什么时候加载,Category重写了父类的方法会怎样,底层源码 ,如果两个Category和一个基类,都有同名方法,先执行哪个
- property会自动生成什么,如果此时已经有下划线_name的实例变量了那会生成什么
- load 和 initialize
Runloop
runloop实现原理
source 类型
线程保活的方式
runloop和多线程的关系,以及timer的关系
第三方库的源码
- AFNetWorking, SDWebImage,YYModel 都是非常常见,基本面试必问
- 举例:SDWebImage怼源码,实现原理,如果正在请求一个地址的图片,这个时候又同时另一个请求,这个时候会再发送一个请求吗?
- 如何自己实现一个 YYModel,具体使用的方法,延伸到 runtime 的源码
生命周期
- app 的生命周期
- 控制器的生命周期
- 视图的生命周期
UI
- UICollectionView 瀑布流
- UITableView 相关的优化,底层原理等
- 页面布局
- layoutSubViews 和 drawInRect 等的区别
- 自己实现一个 UIScrollView
- 事件的传递链和响应链
- 界面非常卡顿怎么定位到具体的类和方法
- UIView和CALayer区别
数据存储
- 数据持久化都有什么,用过什么,归档,偏好设置都可以存储什么样的类型
架构
- MVC,MVVM等,他们的区别和联系,优缺点
- 从 0 到 1 实现一个 app 的思路
- 对于项目从 main 函数执行之前到之后启动优化,卡顿优化和界面优化。
OC 语言特性
- OC 与 C 的区别, OC 与 Java, C++ 的区别。
- iOS中的协议
- OC 动态性
- C语言如何动态的交换两个方法的实现
其他
- KVO 的底层原理,自己实现
- KVC 的底层原理,自己实现
- NSNotificationCenter 的底层原理,是同步还是异步,如何实现一个,如果在子线程接收一个通知能不能接收到
- 几种页面传值方式的区别
- 界面非常卡顿怎么定位到具体的类和方法
- 一个 int 类型的值,被@(10) 包装成 NSNumber 类型,传递到一个接受 id 类型的方法参数中,这个值能不能保持正确
- 在 iPad 上面,分屏功能,拖拽 wps 的文件到qq的这个过程是怎么实现的(进程间通信的方法)
- 如何实现dispatch_once
- Instrument 的使用
- 热修复用过么,平时版本是怎么迭代的,线上bug是怎么修复的
- 实习期的一些内容。
必备书单
- 图解 TCP/IP, 图解 HTTP
- 剑指offer
- Effective Objective-C
- iOS 与 OSX 高级编程
- 以上都是必须要重复看很多遍的书单,其他不太重要的暂不列出。
总结
- 对于秋招来说,由于面向的都是学生,所以主要还是考量的基础,最最重要的包括计算机网络和数据结构算法。对于iOS 开发的同学来说,上面已经包括了大部分我面试中遇到的点以及我认为非常重要的知识点,希望我的面经能给大家带来一些帮助!
另:欢迎大家参加掘金技术正文大赛👉 秋招求职时,写文就有好礼相送 | 掘金技术征文 – 掘金