面试题目
一、iOS 高级开发面试题
1. Objective-C / Runtime
这是高级 iOS 基本必问。
基础
- NSObject 的 isa 是什么?
- Objective-C 中 isa 的作用是什么?
- Class、Meta Class、NSObject 三者是什么关系?
- Objective-C 的消息发送机制是什么?
- [obj doSomething] 底层发生了什么?
- objc_msgSend 做了什么?
- 方法查找流程是什么?
- 什么是方法缓存?
- 方法缓存为什么能够提高性能?
- 如果对象找不到方法,会发生什么?
- methodSignatureForSelector 和 forwardInvocation 是干什么的?
- resolveInstanceMethod 是什么?
- Objective-C 消息转发机制分几步?
- 什么是动态方法解析?
- 什么是消息转发?
- performSelector: 有什么缺点?
- Category 是怎么实现的?
- Category 能不能添加成员变量?为什么?
- Category 和 Extension 有什么区别?
- Category 方法和原类方法重名会发生什么?
- Associated Object 是怎么实现的?
- Associated Object 的使用场景有哪些?
- Method Swizzling 原理是什么?
- Method Swizzling 有什么风险?
- 如何安全地使用 Method Swizzling?
- +load 和 +initialize 有什么区别?
- +load 什么时候调用?
- +initialize 什么时候调用?
- 为什么不建议大量使用 +load?
⸻
二、内存管理
高级 iOS 非常重要。
ARC
- ARC 是什么?
- ARC 是不是垃圾回收?
- ARC 是如何工作的?
- strong、weak、copy、assign 区别?
- weak 为什么能够自动置 nil?
- weak 底层是怎么实现的?
- weak 和 unsafe_unretained 有什么区别?
- strong 和 retain 有什么区别?
- copy 修饰 NSMutableString 会发生什么?
- 为什么 NSString 经常使用 copy?
- block 为什么经常使用 copy?
- __weak 和 __strong 有什么区别?
- __block 和 __weak 有什么区别?
- __block 在 ARC 下会不会造成循环引用?
- Block 的内存结构是什么?
- Block 有哪几种类型?
- NSStackBlock、NSMallocBlock、NSGlobalBlock 区别?
- Block 为什么从栈复制到堆?
- Block 捕获变量的原理?
- Block 循环引用怎么产生?
- 如何解决 Block 循环引用?
- weak-strong dance 是什么?
- 什么情况下不能简单使用 weak?
- dealloc 中需要做什么?
- ARC 下为什么不能手动调用 retain/release?
⸻
三、Runtime + 内存综合题
这部分很容易拉开高级开发和普通开发的差距。
场景题
一个 UIViewController 页面进入后内存一直上涨,你怎么排查?
你需要能够回答:
Instruments → Allocations → Leaks → Memory Graph → 找到对象持有关系 → 分析循环引用 → 分析 Block / Timer / Delegate / Notification / KVO / GCD 等。
面试官可能继续问:
- Timer 为什么容易导致循环引用?
- NSTimer 怎么解决?
- CADisplayLink 怎么解决?
- NotificationCenter 会不会造成循环引用?
- Block 为什么会导致 VC 无法释放?
- GCD Timer 为什么可能造成 VC 不释放?
⸻
四、RunLoop
高级 iOS 很常见。
- 什么是 RunLoop?
- RunLoop 和线程是什么关系?
- 一个线程可以有几个 RunLoop?
- RunLoop 为什么能够让线程不退出?
- RunLoop 的 Mode 是什么?
- NSDefaultRunLoopMode
- UITrackingRunLoopMode
- NSRunLoopCommonModes
- 滑动 ScrollView 时为什么 NSTimer 可能停止?
- 如何让 Timer 在滑动 ScrollView 时继续执行?
- RunLoop Observer 是什么?
- RunLoop Source 是什么?
- Source、Timer、Observer 分别是什么?
- RunLoop 如何处理事件?
- 主线程卡顿和 RunLoop 有什么关系?
高频场景
为什么 UITableView 滑动的时候,Timer 不执行?
这个问题建议你准备成一套完整答案。
⸻
五、多线程 / GCD
这个是高级 iOS 重点。
GCD
- GCD 是什么?
- Serial Queue 和 Concurrent Queue 区别?
- Sync 和 Async 区别?
- dispatch_sync 会不会创建线程?
- dispatch_async 一定创建线程吗?
- 什么是线程死锁?
- 为什么下面代码会死锁?
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"test");
});
- Serial Queue + sync 会不会死锁?
- Concurrent Queue + sync 呢?
- 什么是线程安全?
- 如何保证线程安全?
- GCD 如何实现锁?
- dispatch_barrier 是干什么的?
- Barrier 在什么情况下有效?
- dispatch_group 有什么作用?
- dispatch_semaphore 有什么作用?
- GCD Semaphore 可以实现什么?
- dispatch_once 原理?
- dispatch_once 为什么可以实现单例?
- GCD Timer 怎么实现?
- GCD Timer 和 NSTimer 区别?
⸻
六、锁
高级面试经常深入问。
- 什么是锁?
- NSLock?
- NSRecursiveLock?
- NSConditionLock?
- pthread_mutex?
- os_unfair_lock?
- 自旋锁是什么?
- 互斥锁是什么?
- 自旋锁和互斥锁区别?
- 为什么 OSSpinLock 后来被废弃?
- os_unfair_lock 为什么替代 OSSpinLock?
- @synchronized 原理?
- 哪种锁性能最好?
- 什么情况下应该使用锁?
- 如何设计一个线程安全的缓存?
⸻
七、网络
你有 11 年 iOS 开发经验,这部分建议重点准备。
HTTP
- HTTP 和 HTTPS 区别?
- HTTPS 建立连接过程?
- TCP 三次握手?
- TCP 四次挥手?
- TCP 为什么需要三次握手?
- TCP 如何保证可靠传输?
- HTTP/1.1、HTTP/2、HTTP/3 区别?
- HTTP/2 为什么更快?
- HTTP/3 为什么使用 QUIC?
- GET 和 POST 区别?
- PUT、PATCH、DELETE?
- HTTP 状态码有哪些?
- 301、302、307、308 区别?
- 401 和 403 区别?
- 502、503、504 分别是什么?
- 什么是 DNS?
- DNS 查询过程?
- CDN 原理?
- HTTPS 中证书验证过程?
- 什么是中间人攻击?
- iOS 如何实现 HTTPS 证书校验?
- 什么是 SSL Pinning?
⸻
八、网络框架
如果面试官知道你做过百度这种大型 App,可能会问得比较深入。
- AFNetworking 原理?
- NSURLSession 原理?
- NSURLSession 和 NSURLConnection 区别?
- NSURLSessionTask 有哪些类型?
- UploadTask 和 DownloadTask?
- 网络请求如何取消?
- 网络请求超时怎么处理?
- 如何设计网络重试?
- 什么情况下应该重试?
- 如何避免网络请求重复?
- 如何实现请求缓存?
- 如何实现 Token 刷新?
- Token 过期时多个请求同时刷新怎么办?
- 如何保证只刷新一次 Token?
- 如何实现请求队列?
- 如何实现网络请求优先级?
- 如何设计网络层?
⸻
九、架构
MVC / MVVM
- MVC 的缺点?
- 为什么 ViewController 容易变成 Massive ViewController?
- MVVM 怎么解决?
- MVVM 的缺点?
- ViewModel 是否应该依赖 UIKit?
- MVVM 和 MVC 怎么选择?
- VIPER 是什么?
- Clean Architecture 是什么?
- Coordinator 是什么?
- 为什么需要 Router / Coordinator?
- 如何解决页面之间强耦合?
- 如何设计一个大型 App 架构?
⸻
十、模块化
百度这种大型公司经历,这部分很容易被问。
- 为什么需要模块化?
- CocoaPods 模块化怎么做?
- Framework 和 Static Library 区别?
- Dynamic Framework 和 Static Framework?
- .framework 和 .xcframework?
- XCFramework 解决什么问题?
- 如何拆分大型 iOS 项目?
- 模块之间如何通信?
- 如何避免循环依赖?
- 如何设计组件化架构?
- URL Router 是什么?
- Protocol + Dependency Injection 怎么做组件解耦?
- Swift Package Manager 怎么做模块化?
- CocoaPods 和 SPM 的优缺点?
⸻
十一、iOS 性能优化
高级岗位非常重要。
CPU
- iOS 卡顿是什么原因?
- 主线程为什么会卡顿?
- 如何检测主线程卡顿?
- FPS 是什么?
- CPU 使用率过高怎么排查?
- 如何优化复杂页面?
- UITableView 卡顿原因?
- UICollectionView 卡顿原因?
GPU
- 离屏渲染是什么?
- 哪些操作会产生离屏渲染?
- 圆角为什么可能导致离屏渲染?
- cornerRadius 和 masksToBounds?
- Shadow 为什么可能产生性能问题?
- 如何优化圆角?
- 什么是 GPU Overdraw?
内存
- 内存暴涨怎么排查?
- Memory Leak 怎么排查?
- Memory Graph 怎么使用?
- Instruments 怎么使用?
- 图片为什么容易造成内存问题?
- 图片加载如何优化?
- 大图如何避免 OOM?
- ImageIO 和 UIImage 的区别?
- 如何实现图片降采样?
⸻
十二、启动优化
高级岗位很容易问。
问题
如果让你负责一个大型 App 的启动优化,你怎么做?
建议你按照:
启动阶段→数据采集→定位耗时→优化→验证
来回答。
可能继续问:
- App 启动分几个阶段?
- 冷启动和热启动区别?
- Pre-main 是什么?
- Main 之后发生什么?
- +load 为什么影响启动?
- 动态库为什么影响启动?
- 如何减少动态库?
- 如何优化 +load?
- 如何延迟初始化?
- 如何异步初始化?
- 如何统计启动时间?
- 如何建立启动性能监控?
⸻
十三、Crash / 稳定性
- Crash 怎么排查?
- EXC_BAD_ACCESS 是什么?
- 野指针怎么产生?
- SIGABRT 是什么?
- SIGSEGV?
- KVO Crash 怎么产生?
- 数组越界怎么处理?
- 多线程 Crash 怎么排查?
- Crash Symbolication 是什么?
- dSYM 是什么?
- 如何收集线上 Crash?
- 如何设计 Crash 监控系统?
- 如何处理线上紧急 Crash?
- 什么是 PLCrashReporter?
十四、Swift
如果你面试高级 iOS,Swift 也建议准备。
- struct 和 class 区别?
- Value Type 和 Reference Type?
- 为什么 Swift 推荐 struct?
- copy-on-write 是什么?
- Swift 的 ARC?
- weak / unowned 区别?
- protocol 是什么?
- protocol extension?
- associatedtype?
- opaque type?
- generic?
- associated value?
- enum 为什么强大?
- Optional 底层是什么?
- some 和 any 区别?
- Swift 的闭包?
- escaping closure?
- autoclosure?
- async/await?
- Swift Concurrency?
- Task?
- Actor?
- MainActor?
- Sendable?
- async/await 和 GCD 区别?
⸻
十五、Swift Concurrency
现在高级岗位很值得准备。
重点:
Task {
let result = await request()
}
面试官可能问:
- Task 创建后在哪执行?
- Task 和线程是什么关系?
- Task 会创建线程吗?
- Task cancellation 怎么实现?
- TaskGroup?
- Actor?
- MainActor?
- Actor 如何保证线程安全?
- async/await 如何避免回调地狱?
- Swift Concurrency 和 GCD 如何选择?
十六、Flutter 与 iOS 混合开发
因为你有 Flutter 经历,这部分非常适合当你的加分项。
可能问:
- Flutter 和 Native 如何通信?
- MethodChannel 原理?
- EventChannel?
- BasicMessageChannel?
- Pigeon 是什么?
- Flutter Engine 是什么?
- Flutter 页面如何嵌入 iOS?
- FlutterBoost 原理?
- Flutter 页面生命周期?
- Flutter 和 Native 如何共享数据?
- Flutter 页面为什么第一次打开慢?
- Flutter Engine 如何复用?
- Flutter 多 Engine 有什么问题?
- Flutter 内存占用如何优化?
- Flutter 卡顿怎么排查?
- Flutter 和 Native 如何进行路由管理?
- Flutter 模块如何集成到已有 iOS 工程?
- flutter build ios-framework 做了什么?
- Flutter.xcframework 是什么?
- Flutter 升级后 iOS 工程为什么容易出现问题?
⸻
十七、鸿蒙
你的鸿蒙建议作为第三梯队。
先准备这些:
- HarmonyOS 和 iOS 架构区别?
- ArkTS 是什么?
- ArkUI 是什么?
- Stage 模型是什么?
- Ability 是什么?
- UIAbility?
- WindowStage?
- 页面生命周期?
- 状态管理?
- @State
- @Prop
- @Link
- @Provide
- @Consume
- @Observed
- @ObjectLink
- 鸿蒙线程模型?
- TaskPool?
- Worker?
- 鸿蒙网络请求怎么做?
- 鸿蒙模块化怎么做?
- iOS 和鸿蒙跨端方案怎么设计?
- Flutter + 鸿蒙怎么集成?
- Flutter 鸿蒙适配过程中遇到什么问题?
- DevEco Studio 和 Xcode 的区别?
⸻
十八、最重要:项目实战题
这一部分我建议你重点准备。
因为你是高级开发,面试官很可能不会一直问八股,而是:
“讲一个你负责的比较复杂的项目。”
你可以重点准备你在百度翻译的项目。
例如:
百度翻译项目
可能被问:
- 你负责百度翻译哪些模块?
- 你负责的模块技术难点是什么?
- AI 作文怎么实现?
- AI 问答怎么实现?
- AI 教学怎么实现?
- 流式输出怎么实现?
- Markdown 如何渲染?
- SSE 怎么处理?
- 长连接怎么处理?
- 网络异常怎么处理?
- AI 输出过程中用户退出页面怎么办?
- 如何保证流式数据不丢失?
- 如何处理大量文本渲染?
- 如何优化 AI 页面卡顿?
- 如何做数据埋点?
- 如何做线上问题排查?
- Flutter 和 Native 怎么协作?
- 为什么这个模块使用 Flutter?
- 为什么这个模块使用 Native?
- 如果让你重新设计,你会怎么设计?
⸻
十九、高级开发“压轴题”
这些题你一定要准备。
①设计一个网络层
从 0 开始设计一个 iOS 网络层,你怎么设计?
②设计图片缓存
从 0 设计一个图片加载和缓存框架。
③设计线程安全缓存
多线程环境下设计一个内存缓存。
④ App 启动优化
一个 App 冷启动 2 秒,怎么优化到 1 秒?
⑤页面卡顿
首页滑动 FPS 从 60 掉到 30,你怎么排查?
⑥内存泄漏
页面退出后 ViewController 没有释放,你怎么排查?
⑦ Crash
线上 Crash 率突然上升,你怎么定位?
⑧大型 App 架构
1000 万用户的 App,你如何设计 iOS 客户端架构?
⑨跨端架构
iOS + Android + 鸿蒙 + Flutter,你如何设计技术架构?
⑩ AI App
如果让你设计一个 AI 对话 App 的 iOS 客户端,你怎么设计?
⸻
我建议你接下来这样准备
不要单纯刷题,我们可以直接按照高级 iOS 面试实战来准备:
第一阶段:iOS 八股
Runtime → 内存 → RunLoop → GCD → 锁 → 网络 → Swift
第二阶段:高级能力
性能 → 启动 → Crash → 网络架构 → 模块化 → 组件化
第三阶段:项目
百度翻译 → AI 作文 → AI 教学 → AI 问答 → Flutter 混合开发 → 鸿蒙
第四阶段:系统设计
网络层 → 图片缓存 → 架构设计 → AI App → 跨端架构
第五阶段:模拟面试
我可以直接扮演面试官,按照**“百度高级 iOS 开发 / 资深 iOS 开发”**的难度,一道一道问你。你回答后,我给你判断:
- ⭐ 普通
- ⭐⭐ 中级
- ⭐⭐⭐ 高级
- ⭐⭐⭐⭐ 高级优秀
- ⭐⭐⭐⭐⭐ 大厂高级/资深
并且告诉你面试官真正想听什么,以及你的答案怎么改才能更像高级开发。
如果按照你的经历,我建议下一步先从 **「iOS 高级面试 100 道 + 标准答案」**开始,重点把 Runtime、内存、GCD、RunLoop、网络、性能、架构和你百度翻译项目串起来。
浙公网安备 33010602011771号