核心考点
1. 内存管理 (ARC)
- ARC(Automatic Reference Counting):编译器自动插入 retain/release
- 强引用循环:两个对象互相强引用导致无法释放
- 解决:使用
weak(不增加引用计数,置 nil)或 unowned(不置 nil,对象必须比引用者活得长)
- 闭包捕获列表:
[weak self] 或 [unowned self] 避免循环
2. RunLoop
- 事件循环机制,有任务则处理,无任务则休眠
- Mode:主线程 RunLoop 有 Default、UITrackingRunLoopMode、Common Modes
- 应用场景:Timer、常驻线程、滚动期间暂停图片加载
3. 多线程
| 方式 | 特点 |
|---|
| GCD | 轻量,推荐,任务+队列模型 |
| OperationQueue | 面向对象,支持依赖关系和取消 |
| Thread | 底层,需手动管理 |
- 串行队列:任务顺序执行;并发队列:任务并发执行
- 主队列(串行):UI 操作必须在主线程
- 死锁:主线程同步派发任务到主队列
4. Swift 特性
- Optional:显式处理 nil,
? 可选链,! 强解包,guard let / if let 安全解包
- Protocol + Extension:面向协议编程,替代继承实现代码复用
- Value Types vs Reference Types:struct/enum 是值类型(栈),class 是引用类型(堆)
- Codable:自动序列化/反序列化 JSON
- async/await:Swift 5.5 引入,结构化并发
5. UIKit vs SwiftUI
| 对比 | UIKit | SwiftUI |
|---|
| 范式 | 命令式 | 声明式 |
| 最低支持 | iOS 2+ | iOS 13+ |
| 生态 | 成熟完整 | 快速发展 |
| 调试 | 较复杂 | Preview 实时预览 |
6. 高频面试题
- Category vs Extension:Category 运行时添加方法(不能加存储属性);Extension 编译期扩展(可加存储属性,仅限当前模块)
- KVO / KVC:键值观察/编码,底层通过 isa-swizzling 实现
- App 生命周期:Not Running → Inactive → Active → Background → Suspended
- Instruments 性能分析:Time Profiler(CPU)、Allocations(内存)、Leaks
- Autolayout 原理:Cassowary 约束求解算法