2021年iOS面试小记

1,123 阅读9分钟

摘要

主要是 2021 年「金三银四」的iOS面试记录。

几乎必问的内容:项目情况,下面不再赘述。

美团

  • 消息转发,有什么应用场景?
  • weak 与 asign 的区别。
  • block 如何持有变量?对于栈上对象和静态变量有什么区别?
  • RTMP 与 RTC 的区别,底层是基于什么协议实现的?
  • App 冷启动过程包括什么?
  • HTTPS 的 4 次握手。
  • 进程与线程的区别。
  • 使用过哪些设计模式?
  • MVVM 的优缺点。
  • Swift 约束一个子类必须遵守某个协议,要如何做?

算法题:

  • 寻找 2 个 view 的最近公共父 view。
  • 单向链表中,删除目标结点。(链表操作,注意特殊情况即可)

字节

一面

  • 遇到最有技术难度的一个问题。

  • 内存泄漏有哪些场景?

  • 多线程问题,会打印什么?

    { // 主线程
        NSLog(@"1");
        dispatch_async(other_thread, ^{
            NSLog(@"2");
        });
        dispatch_sync(other_thread, ^{
            NSLog(@"3");
        });
        dispatch_async(dispatch_get_main(), ^{
            NSLog(@"4");
        });
        NSLog(@"5");
    }
    

编码实现:给 window 的子 view 染色,不同层染不同颜色。

二面

  • 虚拟内存与物理内存关系,iOS 的虚拟内存是多少?
  • App 冷启动过程。
  • 事件响应链 hitTest。
  • UIButton 上添加个手势会如何?(UIGesture 与 UIControl 区别)
  • HTTPS 4 次握手过程。
  • 关于 TCP 多种场景的断开(就是确定什么时候才是真正地断开)。

算法题:打印环形数组。

Leader 面

主要是项目情况、计算机基础。

  • 哈希表的底层实现。
  • 数组、链表的区别。
  • HTTPS 4 次握手。
  • HTTPS 中间人攻击是什么,如何防止?
  • HTTP 2.0 有哪些不同?
  • 如何优化网络请求?
  • 直播推拉流方案的实现,相关协议有没有了解。
  • block 何时 copy?

算法题,判断一棵树是否为平衡二叉树。

HR 面

  • 在上家公司比较大的成长是什么?
  • 为什么要换工作?
  • 职业规划。
  • 去年绩效情况,已有的 offer 情况。
  • 前几轮面试的感觉,对自己面试的打分。
  • 有没有觉得做的不错,但前几轮面试官没有问出来的地方?

淘宝

一面

  • weak 的实现原理。
  • 如何监控卡顿?有哪几种方案?
  • 个人觉得比较有挑战的事情。
  • SVGA 与 Lottie 的优缺点。
  • 职业规划是什么?
  • 工作中会关注哪些性能指标?
  • App 启动有哪些过程?

算法题

  1. 递归实现回文判断。
  2. 实现一个类似 NSCache 的 LRU 缓存类,可以设置缓存个数上限,当达到上限后,可以按照 LRU 规则淘汰换对象,必须线程安全,在内存报警的时候可以自动清空缓存。

二面

考查项目和计算机基础(操作系统、网络、算法),会询问擅长什么,然后再问具体的问题。

面试官直言会更侧重基础和潜力。

  • 分享最有技术深度的案例。
  • 做了这么久 iOS,有什么觉得哪方面比较擅长的?
  • 开放性问题:若有 2 个方法,如何加锁,能造成死锁?
  • RunLoop 是如何实现的呢?尤其是如何把线程唤醒的,用的什么原语?(感觉是操作系统相关知识点)
  • 业务开发时,会关注哪些统计数据,技术指标这些,会怎么做记录呢?
  • 从前一家公司换工作比较急,有没有考虑过继续待在那会怎么做?有没有做过什么尝试?
  • 职业规划。

算法题

  1. 剑指 Offer 42. 连续子数组的最大和 - 力扣(LeetCode)
  2. 求平衡二叉树最近公共祖先。

Leader 面

  • 在这家公司的比较有成长的点是什么?列 3 个点,前后对比如何?
  • 统计线上代码使用频率的方案,有没有了解过?(Clang 插桩)
  • 组件化只是解决并行开发的办法之一,后面更进一步的优化是否有了解过,比如说多个仓库怎么管理,打包这些呢?
  • 如果这次面试失败了,会怎么做?
  • 去年拿到这个绩效的原因是什么?
  • 你的优势是什么?
  • 职业规划。
  • 最近一两年在学习什么?有在工作中应用吗?

新浪微博

一面

  • 一个能体现技术水平的案例。

  • 希望在 vc_a 的 viewDidAppear 里打印东西,但对其他 vc 不做处理,可以如何去实现?(Runtime 相关知识点)

  • 要 hook 一个父类的方法,要怎么办?

  • 如何解决滑动列表的卡顿问题?

  • 多线程问题,以下代码打印什么?

    dispatch_sync(dispatch_get_main() ^{
        NSLog(@"1");
    })
    NSLog(@"2");
    
  • KVO 是如何实现的?

  • SDWebImage 的下载过程是怎么样的?

  • 事件传递链、响应链。

  • 如何实现 label 响应了事件,其父 view 也能响应?

二面

  • 举一个业务需求难度比较大的例子。如何设计的,都有哪些类?
  • Lottie 与 SVGA 对比。
  • 如何优化网络?可以从哪些环节进行优化?

快手

一面

  • TableView 如何设置自动计算高度?

  • ObjC Protocol 属性要如何实现?

  • KVO 会有什么问题,具体是如何实现的?

  • @synchronized(self) {} 会有什么问题?

  • TableView 有哪些优化卡顿的方案?

  • 多线程的问题,编码实现,需要保证任务按以下顺序执行:

    A,B -> C, B,D -> F, C,F -> K

算法题:单链表寻找环。

二面

  • 印象深刻的一个问题。
  • RunLoop 如何让线程休眠?
  • 对于 self 的理解?比如子类调用 alloc init 方法,虽然它没有实现,但它是可以正常创建的。

编码题:CollectionView 瀑布流实现逻辑。

Leader 面

  • HTTPS 的握手过程有了解吗?
  • TCP 与 UDP 区别。
  • WebRTC 是 P2P,怎么实现了多人语音?
  • 字节流与数据报文区别,毕竟在网络层都是二进制流的形式。

B 站

记录遗漏不少。

一、二面

除项目情况外,主要是常见的一些 iOS 问题。

算法题:字符串去重。

Leader 面

在上家公司的积累有哪些?

HR 面

  • 分享工作经历。
  • 个人学习方法。
  • 对 B 站的了解如何?
  • 已有 offer 的一些情况。
  • 你的同事、朋友、领导对你的评价是怎样的?

网易 - 易次元

除了一些常见 iOS 问题外,还有一些其他的:

  1. Framework 硬链接是什么?
  2. static 函数是否可以被 hook(没有通过消息传递,所以无法做方法交换)
  3. 渲染逻辑,为什么只能在主线程渲染 UI。
  4. GET 与 POST 区别。
  5. HTTP 与 HTTPS 区别。
  6. 如何对 HTTP 请求做限速?
  7. 富文本渲染 YYKit 的原理是什么?
  8. 原生监听 JS 请求,是监听 WebView 哪个属性?

腾讯

侧重技术基础。

一、算法

  1. 整数 0 1 2,有一定数量,设计一个排序算法,要求时间复杂度 O(n),空间复杂度 O(1)。
  2. 输入一个都是括号的字符串,左右成对就说明合法,如何判断合法?
  3. 继第 2 题,求其中合法子串的最大长度。
  4. 求非负整数平方根的整数部分。

二、网络

  • TCP 滑动窗口是什么?如何实现拥塞控制的?
  • 从客户端发起一个请求,如何到达服务端?整体流程是怎样的?

三、设计模式

常用哪些设计模式?能具体讲讲吗?

BIGO

一面

  • vc.view subviews 在 didDisappear 后,会被移除掉吗?

编码题:对大量图片,按分辨率大小进行排序(要注意 IO 瓶颈)。

二面

算法题:

  • 单链表反转变体
  • 汉诺塔问题 推导出通项公式

企业微信

  • ObjC 是如何实现面向对象的?
  • 组件化有没有自己的思考?

算法题:实现 LFU 缓存逻辑。

虎牙

  • 内存管理,引用计数,对象何时被销毁?

  • SVGA 的里的渲染是 CPU 还是 GPU?

  • NSArray containsObject 会调用 obj 的什么方法?

  • 字典与数组的对比。

  • 有没有什么 Runtime 接口,能获取到某一模块是否被引用了?或者说了解其占比?

  • 多线程问题

    • iOS 用到锁有哪些?
    • 如 @synchronized{} 递归调用没有问题吗?
    • 对于自旋锁的理解
    • 使用 GCD 的话,如何实现限制最大并发数?

陌陌

一面

问题多数是项目相关、方案设计。

  1. 事件响应链。
  2. 如何获得类方法列表(注意它的保存位置)。
  3. 图片缓存的方案设计,可使用 NSCache。
  4. 路由设计是如何实现的?
  5. 逆向方面,要如何对某个方法加防护呢?
  6. 常见内存泄漏。
  7. 用过 Runtime 哪些方法做过些什么?

二面

  • 觉得自己解决得比较有技术性的问题是什么?

算法题:

  • 2G 正整数,在内存容易比较的小设备如何查找(整数 bitmap 算法)
  • 大数相加

Leader 面

  • 了解履历。
  • 项目方面,列举 2 个有技术深度的经历。

Leader 面

  • 举个有技术深度的例子。
  • Swift 对比 ObjC 的特别之处在哪?
  • 近 2 年出现的新技术,有做过哪些有深度的研究?
  • 常见架构对比。

酷狗音乐

一面

  • 简单介绍下 ARC。
  • 内存泄漏一般在哪些情况出现?
  • 对于 Timer 造成的循环引用,有什么办法去避免?
  • 日常遇到的一些内存问题
  • App 启动优化的思路。
  • 分类如何添加属性。
  • 单例实现有哪些注意点?

Leader 面

  • 对 block,delegate,kvo,notification 用法的总结

算法题:

  • 给一个整型数组和一个目标值,判断数组中是否有两个数字之和等于目标值

交叉面试

  • 会用什么办法做代码扫描?
  • 如何学习新技术?iOS14 出来了,有关注什么吗?
  • theos 原理
  • http 与 https 区别
  • tcp 与 udp 区别
  • Swift 与 ObjC 对比

YY 直播

一、二面

  • 内存分配问题,哪些在栈上、哪些在堆上。
  • Block 用 __block 修饰变量,内部如何实现的呢?
  • weak 的实现原理?
  • RunLoop 过程。
  • 点击后事件是如何传递的?
  • 一个 view 是如何渲染到屏幕上的。
  • 谈谈对观察者模式的理解。
  • 几种定时器的实现?
  • 直接看线上崩溃,寻找原因。

Leader 面

关于事件响应链,自己会如何实现 hitTest 方法。

小结

高频问题记录:

面试总结高频问题.png

考查点主要是项目、iOS相关技术、计算机基础,个人感受:

  1. ObjC 比重并不大。
  2. 算法比重增加,但以 leetcode 上的简单、中等难度为主。
  3. 计算机基础必考。
  4. 项目上,期望有体现技术深度的案例,能有性能优化例子更好。
  5. 简历上所有项目都要熟悉,即使是一些比较久远的项目,也要提前准备下。