• Home
  • About
    • 杜玮的博客 photo

      杜玮的博客

      iOS小开发仔,objective-c、Java、C

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

腾讯面经

27 Apr 2018

Reading time ~14 minutes

内推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需要手动开启。

    深入理解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,并入职了



iOS开发面经 Share Tweet +1