内推sng一面
锁了我一个月终于来面试我了,没有自我介绍环节,上来就直接问问题了。
-
项目相关问题
(略)
-
关于项目里的优化,使用了instrument的哪些功能
time profile、core animation、leak
-
layoutSubviews这个方法在什么时机被调用
ini
初始化不会触发layoutSubviews
,但是是用initWithFrame
进行初始化时,当rect的值不为CGRectZero
时,也会触发addSubview
会触发layoutSubviews
- 设置view的Frame会触发
layoutSubviews
,当然前提是frame的值设置前后发生了变化 - 滚动一个
UIScrollView
会触发layoutSubviews
- 旋转Screen会触发父UIView上的
layoutSubviews
事件 - 改变一个UIView大小的时候也会触发父UIView上的
layoutSubviews
事件
-
使用过数据库吗,是怎么样的数据库
用realm,他是一个MVCC(多版本并发控制)类型的数据库,采用的是像git一样的多版本控制,某一个时刻只能有一个写入操作,而且总是操作最新的版本。对象之间的关系是本地一用,采用零拷贝架构,每一个realm对象通过一个本地的long指针和底层数据库对应,而不需要创建数据库连接,并发送到磁盘上执行查询读取等操作,再保存到内存中以对象形式返回,而是直接跳过拷贝过程,简单计算偏移值来找文件中的数据,提供自动更新的功能。
-
realm里面的threadSafeReference
因为realm多版本并发控制,所以同一时间只能有一个写入操作,这就导致了不能在线程之间传递realm对象,需要用到
threadSafeReference
在线程之间传递realm对象。 -
为什么说OC是一门动态语言,他和C语言相比有什么不同
OC动态语言是因为它将对象和方法的类型放到了运行时去判断,提供了强大的runtime属性,而c语言是一门静态语言,它的类型是由编译期判断的。
-
说一下你了解的设计模式
- 单例模式
- 观察者模式
- IOC控制反转
- 代理模式
- 工厂模式
- 抽象工厂模式
- MVC模式
-
项目里面用了firebase的realtime database,具体是一个怎么样的数据库
它是一个非关系型的数据库,采用的是JSON树的格式,客户端可以监听JSON树中的某个节点,当它的更新时候可以获取新的值。
-
那它底层是怎么实现的
我说我猜是用
WebSocket
实现的,它问了我WebSocket
相关的知识。webSocket
是http的一个补充,在普通的http协议上可以声明将该协议升级到websocket,并由服务器校验是否为正确的websocket代理,当通过后就建立了websocket连接。websocket可以在服务器数据有更新的时候主动推送给客户端,而不需要客户端做长轮询的操作。 -
然后他说用Socket也可以实现,问我websocket和socket的区别
我???
-
如何高效的切圆角,原来的方法会有什么问题
用
CAShapeLayer
配合UIBerizerPath
来切,原来的会发生离屏渲染问题。 -
什么是离屏渲染,为什么会造成卡顿
在OpenGL里面有当前屏幕渲染(OnScreenRending)和离屏渲染(OffScreenRending),当前屏幕渲染不需要额外内存空间,也不需要新建上下文,但是相应的它的渲染能力比较差,如果遇到复杂的渲染工作则需要使用离屏渲染。离屏渲染则需要额外的缓存空间,并且需要切换上下文,他能够将复杂的渲染工作分离,存放到缓存区中,当所有渲染工作完成了再组合交付显示。由于iOS垂直同步的机制,在一个时钟周期内如果没有渲染提交,则会使用上一帧的内容,所以离屏渲染会导致卡顿。
-
看过哪些开源框架,说一下他的流程
SDWebImage
-
有什么问题想问他
(略)
大概就是这样,第一次面就是面腾讯,当初感觉有很多地方都答得不是很好,亏了亏了。
腾讯sng二面
-
没有自我介绍环节,直接问项目相关
(略)
- 怎么高效切圆角
-
离屏渲染相关问题
上面有
-
你了解的数据结构有哪些
- 链表
- 数组
- 哈希表
- 树
- 图
-
线程同步机制有哪些
我说了可以加锁,还有PV操作,然后问加锁有什么作用。
加锁可以让一个线程访问一个类的数据的时候进行保护,防止其他线程突然进入修改数据,必须要当前线程读取完其他线程才能使用该数据,避免数据不一致和脏数据的出现。
-
说一下你了解的runloop
我说了runloop就是一个大循环,然后介绍了几种模式,一些控件需要基于runloop实现,主线程的runloop默认开启,子线程的runloop需要手动开启。
-
内存泄漏的几种情况
- block循环引用
- c方式申请的内存没有释放
- c类型对象没有释放
- NSTimer持有target,target为self又持有timer时会循环引用
-
怎么检测野指针问题
使用instrument的zombie,或者在xcode的diagnostic中选择enable zombie object
-
怎么在代码层面上避免野指针问题
当时我不知道他究竟想问啥,结束之后想了想,应该是想问我strong-weak转换的问题。
-
看过哪些开源框架
SD~
-
TCP是在哪个层的协议
运输层
-
TCP三次握手
略
-
算法题:如何判断一个链表里面有环
好多面试官喜欢问这道题,剑指offer里面有
-
智力题:有四个药瓶,只有一个被污染了,污染的重量+1,给一个称(不是天平)怎么称一次就找到被污染的药瓶?
不会
-
有什么问题问他
略
面完这个就没消息了,肯定是凉凉了。
校招流程MIG一面
面试官很好人,但应该不是做iOS开发的,现场面试等了一个多钟头
-
自我介绍,项目相关
问了大概20分钟(略)
-
内存泄漏的几种情况和对应的解决方案
上面有
-
写一下你了解的网络层五层结构和七层结构
我就写了四层……
五层结构:
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层(我居然把这个忘了)
七层结构:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
-
TCP三次握手四次挥手
还要画图
-
TCP和UDP区别
TCP:
- 面向连接
- 有差错控制
- 一对一传输
- 首部开销比较大
- 面向字节流
UDP:
- 无连接
- 没有差错控制
- 一对一、一对多、多对多都可以
- 首部开销比较小
- 面向报文
-
线程与进程的关系
进程切换和创建的开销比线程大得多,每一个进程都有一个线程作为主线程进行操作,进程的操作都是由线程来完成
-
进程间怎么通讯
不会
(使用共享内存)
-
数组和链表的区别
数组地址是连续的,链表不连续,数据可以根据下标取数据,链表不可以,所以数组存取速度比较快,但是链表相应数据操作比较灵活。
-
树和图有什么遍历方式
树:前中后序遍历 图:深度优先搜索法、广度优先搜索法
-
写一个二叉树的前序和后序遍历序列
(略)
-
写一个双向链表删除节点的操作
好简单
-
写一下数据库建表,设置对应主键
遇到数据库我就凉了,不会
-
数据库事务的四个特征
ACID
-
冒泡排序、归并排序、快排这三个的时间复杂度和空间复杂度
算法 时间复杂度 空间复杂度 冒泡排序 O(n^2) O(1) 归并排序 O(nlog2n) O(n) 快速排序 O(nlog2n) O(nlog2n) 然后面试官说比较晚了,没时间给你做算法,我就说要不我给你写个快排吧,然后就愉快的手撕了一个快排代码。
- 职业规划相关,工作地点有没有要求
- 问项目中学到的东西(非技术上),你未来的学习计划
- iOS学习历程
- 考研创业有这方面的想法吗
-
有什么问题问他
(略)
感觉不算太难,一开始知道不是iOS开发的面还是有点怕,还好只是问基础的问题,所以应该还行。
校招MIG二面
大概是技术总监面我,并没有问技术相关的问题,25分钟左右就结束了
- 自我介绍
- 分别介绍一下你做的项目,以及你在里面的职责
- 写一下你重构的网络框架的结构
- 学了哪些专业课
-
成绩怎么样
(班里前十!)
- 有打算考研吗
- 为什么不考研
-
平常都有关注哪些技术博客
唐巧、casa、逛stackOverflow
-
有了解过新技术吗,比如AI、区块链
我说我有简单接触过AI,我会A*算法和∂ß剪枝法
- 评价一下自己的性格
- 如果你加入到我的团队里面,你觉得你会怎么发挥你的领导能力
- 首选的事业群是哪个
- 如果我给你Offer,不是微信事业群,你会来吗
- 有什么问题问他
校招MIG三面
等了我好几天,状态还是一直在复试,然后突然打电话给我说要加面一面总监面
- 自我介绍
- 介绍一下自己做过的项目,在里面担任的职责
- 做项目遇到的难点
- 还有没有其他难点
- 你博客上主要是什么内容
- 主要获取新资讯的途径
- 未来两到三年的工作规划
- 有什么问题问他
13分钟完事,说下午会有HR面
校招MIG HR面
晚上10点半终于迎来了“下午”的HR面
- 自我介绍
- 简单介绍一下做过的项目
- 遇到的困难
- 评价一下自己
- 未来五到十年的工作规划
- 大概什么时间能过去实习
- 家庭状况
- 工作地点
- 有什么问题问她
- 有没有考研打算
我纯正的粤普被吐槽了- -
最后也拿到了Offer,并入职了