摘要
主要是 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 启动有哪些过程?
算法题
- 递归实现回文判断。
- 实现一个类似 NSCache 的 LRU 缓存类,可以设置缓存个数上限,当达到上限后,可以按照 LRU 规则淘汰换对象,必须线程安全,在内存报警的时候可以自动清空缓存。
二面
考查项目和计算机基础(操作系统、网络、算法),会询问擅长什么,然后再问具体的问题。
面试官直言会更侧重基础和潜力。
- 分享最有技术深度的案例。
- 做了这么久 iOS,有什么觉得哪方面比较擅长的?
- 开放性问题:若有 2 个方法,如何加锁,能造成死锁?
- RunLoop 是如何实现的呢?尤其是如何把线程唤醒的,用的什么原语?(感觉是操作系统相关知识点)
- 业务开发时,会关注哪些统计数据,技术指标这些,会怎么做记录呢?
- 从前一家公司换工作比较急,有没有考虑过继续待在那会怎么做?有没有做过什么尝试?
- 职业规划。
算法题
- 剑指 Offer 42. 连续子数组的最大和 - 力扣(LeetCode)
- 求平衡二叉树最近公共祖先。
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 问题外,还有一些其他的:
- Framework 硬链接是什么?
- static 函数是否可以被 hook(没有通过消息传递,所以无法做方法交换)
- 渲染逻辑,为什么只能在主线程渲染 UI。
- GET 与 POST 区别。
- HTTP 与 HTTPS 区别。
- 如何对 HTTP 请求做限速?
- 富文本渲染 YYKit 的原理是什么?
- 原生监听 JS 请求,是监听 WebView 哪个属性?
腾讯
侧重技术基础。
一、算法
- 整数 0 1 2,有一定数量,设计一个排序算法,要求时间复杂度 O(n),空间复杂度 O(1)。
- 输入一个都是括号的字符串,左右成对就说明合法,如何判断合法?
- 继第 2 题,求其中合法子串的最大长度。
- 求非负整数平方根的整数部分。
二、网络
- TCP 滑动窗口是什么?如何实现拥塞控制的?
- 从客户端发起一个请求,如何到达服务端?整体流程是怎样的?
三、设计模式
常用哪些设计模式?能具体讲讲吗?
BIGO
一面
- vc.view subviews 在 didDisappear 后,会被移除掉吗?
编码题:对大量图片,按分辨率大小进行排序(要注意 IO 瓶颈)。
二面
算法题:
- 单链表反转变体
- 汉诺塔问题 推导出通项公式
企业微信
- ObjC 是如何实现面向对象的?
- 组件化有没有自己的思考?
算法题:实现 LFU 缓存逻辑。
虎牙
-
内存管理,引用计数,对象何时被销毁?
-
SVGA 的里的渲染是 CPU 还是 GPU?
-
NSArray containsObject 会调用 obj 的什么方法?
-
字典与数组的对比。
-
有没有什么 Runtime 接口,能获取到某一模块是否被引用了?或者说了解其占比?
-
多线程问题
- iOS 用到锁有哪些?
- 如 @synchronized{} 递归调用没有问题吗?
- 对于自旋锁的理解
- 使用 GCD 的话,如何实现限制最大并发数?
陌陌
一面
问题多数是项目相关、方案设计。
- 事件响应链。
- 如何获得类方法列表(注意它的保存位置)。
- 图片缓存的方案设计,可使用 NSCache。
- 路由设计是如何实现的?
- 逆向方面,要如何对某个方法加防护呢?
- 常见内存泄漏。
- 用过 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 方法。
小结
高频问题记录:
考查点主要是项目、iOS相关技术、计算机基础,个人感受:
- ObjC 比重并不大。
- 算法比重增加,但以 leetcode 上的简单、中等难度为主。
- 计算机基础必考。
- 项目上,期望有体现技术深度的案例,能有性能优化例子更好。
- 简历上所有项目都要熟悉,即使是一些比较久远的项目,也要提前准备下。