Skip to content

Latest commit

 

History

History
245 lines (179 loc) · 10.7 KB

25小米百度bigo滴滴快手等iOS面试题2020年上.md

File metadata and controls

245 lines (179 loc) · 10.7 KB

小米百度bigo 滴滴 快手等iOS 面试题2020年上

xiaozhuanlan.com/topic/7628534019 第25份面试题

面试过程

  • 在疫情期间都是远程面试,下边先介绍一下疫情期间面试的一些公司的面试情况。同时拿到了其中几家的 offer。下边介绍的面试题只还原了其中印象比较深的部分,会存在不足的情况,并不代表面试的全部。

小米

一面 (已更新参考答案)

  • 介绍有哪些设计原则,并让比较详细的说了其中开闭原则在项目中的应用。
    • 六大设计原则
    • 开闭原则在项目中的应用:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。(分类)
  • 介绍设计模式,然后其中主要问了我抽象工厂和适配器两种模式。
  • 介绍 runloop 相关的知识和在实际开发中的使用情况

要求详细的描述事件响应链

参考内容
//判断点击的位置是不是在视图内
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;
//返回点击的视图
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;
	
事件的传递
  • 加入到一个由UIApplication管理的事件队列中(队列的特点是FIFO,即先进先出,先产生的事件先处理才符合常理,所以把事件添加到队列中)

  • UIApplication会发送事件给应用程序的主窗口UIWindow。

  • 主窗口UIWindow会调用hitTest:withEvent:方法在视图(UIView)层次结构中找到一个最合适的UIView来处理触摸事件(也就是把事件传递给那个最适合的UIView)

工作流程
  • 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内

  • 若pointInside:withEvent:方法返回NO,说明触摸点不在当前视图内,则当前视图的hitTest:withEvent:返回nil

  • 若pointInside:withEvent:方法返回YES,说明触摸点在当前视图内,则遍历当前视图的所有子视图(subviews),调用子视图的hitTest:withEvent:方法重复前面的步骤,子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图的hitTest:withEvent:方法返回非空对象或者全部子视图遍历完毕。

  • 若第一次有子视图的hitTest:withEvent:方法返回非空对象,则当前视图的hitTest:withEvent:方法就返回此对象,处理结束

  • 若所有子视图的hitTest:withEvent:方法都返回nil,则当前视图的hitTest:withEvent:方法返回当前视图自身(self)

二面(已更新参考答案)

介绍过往的项目经验,因为曾经的项目和所面试的部门岗位需求匹配度较高,所以这块的时间占比较多。

  • 【回文算法】判断一个字符串是不是对称的字符串,比如 abba 或者 aba 这样的就是对称的。

    参考内容
     bool check_string(char *s){
       int len = strlen(s);
       int i = 0;
       int j = len-1;
       while(i < j){
         if(s[i] != s[j])return false;
       }
       retrun true;
     }
     
    
  • block 的实现原理

    参考内容
       struct __main_block_impl_0 {
      struct __block_impl impl;
      struct __main_block_desc_0* Desc;
      __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
      }
     };
    
    
  • 比较详细的介绍 https 的过程。

  • 过往开发中做过哪些优化向的工作,问的也比较详细。

  • 如何检测项目中的卡顿问题(比如假死)

  • 比较详细的介绍消息转发流程和事件响应链

  • GCD 的底层线程调度原理

  • 介绍 hash 算法的原理

三面

  • 一个二叉树逐层打印的算法题
  • 介绍自己的过往的项目经验,会结合项目问一些架构向的思考
  • 如果现在做一个新的网络层框架,有哪些需要考量的点
    • 参考知名网络框架,或者绘制UML图。

百度

百度只有一面,因为面得是百度的商业化部门,对于细节的要求非常严格。个人感觉自己的表现确实不是很好。

  • 判断一个字符串是不是 ipv6 地址(要求尽全力的考虑所有异常的情况)

  • PS:当时面试官明确告诉我,这个面试题做不好,面试是直接结束的。

  • 介绍界面卡顿的优化有哪些可以优化的点。

    参考内容 * 复用cell,缓存 Cell 高度,减少一些复杂的 layout,文字计算等,可进行缓存处理; * 异步渲染内容到图片&&图片解码放到子线程处理
  • 介绍 UIResponder 的继承链。然后说事件响应链。

    • 参考上文小米面试题解答。

Bigo

感觉面试的这些公司,Bigo 对于基础的考察最全面。

一面

  • (算法)找出一个页面中漏出部分面积最大的试图,重合的部分按照最上层的面积算漏出,会有时间复杂度的要求。
  • 简单地介绍的过往的项目经验
  • 控件的点击事件和添加在上边的手势谁先响应,并说明原因
  • 谈 CoreAnimation 和 CoreGraphic 的区别
  • 说 @synchronized 锁的实现原理,并说明其中可能存在的问题。同时介绍了 iOS 开发中常见的锁。
  • 介绍编译的过程和原理
  • 谈对于 bitcode 的理解和作用。
  • 详细的介绍了 Https 的过程。

二面

  • 介绍属性常用修饰符,介绍 assign 和 weak 之间的区别。这块会延伸到内存管理相关,比如引用计数的方式。
  • 聊对于 GCD 的理解,和 GCD 底层是如何进行线程调度的。聊 GCD 中常见方法的使用 (group ,信号量
  • ,barrier 等)
  • 详细的介绍了 KVC 和 KVO 的原理。
  • 介绍消息转发过程
  • 介绍对于 Runloop 并介绍知道的应用场景。再具体场景中会有追问。
  • 介绍项目优化的经验,这一块会聊的比较细。
  • 介绍对于静态库和动态库的理解。
  • 在 webview 使用过程中存在的问题和解决方案。

三面

  • 介绍了过往 RN 的使用经验和对于 Flutter 的理解。
  • 谈对于组件化的理解和市面上常见的组件化方案
  • 问了一些 APM 向上的问题。
  • 谈个人对于项目架构选择的理解。自己如何进行架构的选择(主要对于 MVVM,MVC等,后文有个人对于这一块的理解)
  • 谈个人规划

滴滴

一面

滴滴的一面分为两部分。

  • 第一部分:过往项目经验,会对自己的过往项目经验,结合自己的描述,面试官问你介绍到的项目中涉及到问题,然后会据此引申出一些问题,这一部分占比比较大。
  • 第二部分是基础知识面
  • 谈属性修饰符,如果 assign 修饰对象可能存在的问题和原因。
  • 比较的深入的聊了内存管理的内容,包含引用计数和 weak 修饰的对象的内存管理的过程。问的会比较深入。
  • 讲 runloop 的过往使用经验。
  • 介绍自己比较熟悉的三方库的实现原理

二面

  • 对于锁的理解(自旋锁和互斥锁),以及 iOS 开发中常见的锁。同时要求介绍个人在开发过程中在哪些场景下用到过锁。
  • 在实际开发中遇到过哪些多线程问题以及如何进行解决的。
  • 为什么不能在异步线程中更新页面,介绍原因。
  • 对于内存泄漏的了解,以及介绍知道的解决方案。
  • 一些优化向上的问题,主要是根据自己介绍的优化进行较为深入的追问。
  • 一个坦克从一个空间的起点到终点,中间在某些位置上有阻隔的情况下,判断从起点到终点是否有可行路径的算法题。

三面

  • 比较详细的介绍之前的项目经验和主要负责的内容
  • 介绍过往项目中最有挑战的事情,并会据此深入的聊。
  • 介绍了一些架构向的理解
  • 谈个人规划

快手

快手的一面是跨部门面试,二面是本部门面,所以一二面面试题会有一些重复,只写了一次。

一面

  • 介绍过往的项目经验
  • 两个不算难的算法题(具体的忘记了...)
  • 聊了 assign 修饰对象可能存在的问题
  • 聊过往项目中的优化经验
  • 介绍消息转发流程

二面

  • 比较详细的聊到的 block,深入的讲了其中的实现原理,并介绍不同变量的引用方式。
  • 介绍开发中常见的循环引用,并说明其中的原因和解决的方案和原理。
  • 介绍 Runloop 并讲应用场景。
  • 二叉树翻转

三面

  • 一道多线程实际场景下的问题,要求远程写出实现方案的代码
  • 聊对于 MVVM,MVC 和 MVP 的理解。
  • 介绍过往项目中 RN 的使用经验和遇到的问题。
  • 讲如何将一张内存极大的图片可以像地图一样的加载出来(只说实现思路)
  • 聊对于组件化的理解,对于市面上的组件化方案的理解,优劣分析等。

其他

  • 除了上边介绍的公司外,还面了平安,51 talk,58 同城,好未来,美篇。
  • 因为绝大部分面试内容和上边的基本上只是重复,只对差异性的面试题进行了总结。
  • 对图像编解码的了解
  • 在子线程中是如何进行内存管理的JSBridge 是如何实现的,以及和原生的调用关系。
  • 问到了一些 AFNetworking 和 SDWebImage 相关的实际开发中的问题。

觉得整理的蛮不错,可以赞赏一下旺仔(收集整理不易,且赞且珍惜)

链接